仓颉中,可以使用访问修饰符来控制对类型、变量、函数等顶层声明的可见性。 仓颉有 4 种访问修饰符:private、internal、protected、public
- private 表示仅当前文件内可见。不同的文件无法访问这类成员。
- internal 表示仅当前包及子包(包括子包的子包)内可见。同一个包内可以不导入就访问这类成员,当前包的子包(包括子包的子包)内可以通过导入来访问这类成员。
- protected 表示仅当前模块内可见。同一个包的文件可以不导入就访问这类成员,不同包但是在同一个模块内的其它包可以通过导入访问这些成员,不同模块的包无法访问这些成员。
- public 表示模块内外均可见。同一个包的文件可以不导入就访问这类成员,其它包可以通过导入访问这些成员。
| 修饰符 | 文件 | 包与子包 | 模块 | 所有包 |
|---|---|---|---|---|
| private | Y | N | N | N |
| internal | Y | Y | N | N |
| protected | Y | Y | Y | N |
| public | Y | Y | Y | Y |
除此之外,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
}
运行结果