华为仓颉-类定义与接口实现

117 阅读2分钟

仓颉中,可以使用访问修饰符来控制对类型、变量、函数等顶层声明的可见性。 仓颉有 4 种访问修饰符:private、internal、protected、public

  1. private 表示仅当前文件内可见。不同的文件无法访问这类成员。
  2. internal 表示仅当前包及子包(包括子包的子包)内可见。同一个包内可以不导入就访问这类成员,当前包的子包(包括子包的子包)内可以通过导入来访问这类成员。
  3. protected 表示仅当前模块内可见。同一个包的文件可以不导入就访问这类成员,不同包但是在同一个模块内的其它包可以通过导入访问这些成员,不同模块的包无法访问这些成员。
  4. public 表示模块内外均可见。同一个包的文件可以不导入就访问这类成员,其它包可以通过导入访问这些成员。
修饰符文件包与子包模块所有包
privateYNNN
internalYYNN
protectedYYYN
publicYYYY

除此之外,class还有 open装饰,官方意思是当带 open 修饰的实例成员被 class 继承时,该 open 的修饰符也会被继承。当非 open 修饰的类中存在 open 修饰的成员时,编译器会给出告警。 sealed 修饰符只能修饰抽象类 定义 sealed abstract class 时若提供 public/open 修饰符 在类内部,我们支持 This 类型占位符,代指当前类的类型 有面向对象类,就有多态,重新和重载

下面是演示一个导入包实现实现接口的实例

定义一个接口

package HelloCangjie.demo

public interface Person{
    func say(content:String):Int64
}

实现接口

package HelloCangjie.demo

public class Student <: Person{

    private let role:String
    
    public init(role:String){
        this.role = role
    }
    public func say(content:String):Int64{
      println(this.role +" say:"+ content)
      return 0
    }

}

第二个实现接口类


package HelloCangjie.demo

public class Teacher <: Person{

    private let role:String
    public init(role:String){
        this.role = role
    }
    public func say(content:String):Int64{
      println(this.role +" say:"+ content)
      return 0
    }
}


主程序入口调用

package HelloCangjie
import {HelloCangjie.demo.*}

main(): Int64 {

    let st = Student("Student")
    st.say("你好 老师")

    let tear = Teacher("Teacher")
    tear.say("你好 同学")
    return 0
}

运行结果

image.png