类和接口
仓颉支持使用传统的类(class)和接口(interface)来实现面向对象范式编程。仓颉语言只允许单继承,每个类只能有一个父类,但可以实现多个接口。每个类都是Object的子类(直接子类或者间接子类)。此外,所有的仓颉类型(包括Object)都隐式的实现Any接口。
仓颉提供open修饰符,来控制一个类能不能被继承,或者一个对象成员函数能不能被子类重写(override)。
在下面的例子中,类 B 继承了类 A,且同时实现了接口 I1 和 I2。为了让 A 能够被继承,它的声明需要被open修饰。类 A 中的函数f也被open修饰,因此可以在 B 中被重写。对函数f的调用会根据对象具体的类型来决定执行哪个版本,即动态派遣。
open class A { let x: Int = 1 var y: Int = 2 open func f(){ println("function f in A") } func g(){ println("function g in A") }} interface I1 { func h1()} interface I2 { func h2()} class B <: A & I1 & I2 { override func f(){ println("function f in B") } func h1(){ println("function h1 in B") } func h2(){ println("function h2 in B") }} main() { let o1: I1 = B() let o2: A = A() let o3: A = B() o1.h1() // "function h1 in B" o2.f() // "function f in A" o3.f() // 动态派遣,"function f in B" o3.g() // "function g in A"} |
---|
仓颉的 interface 之间也可以继承,并且不受单继承的约束,即一个 interface 也可以继承多个父 interface。如下示例,I3可以同时继承I1和I2。因此,若要实现I3,需要提供对f、g和h三个函数的实现。
interface I1 { func f(x: Int): Unit} interface I2 { func g(x: Int): Int} interface I3 <: I1 & I2 { func h(): Unit} |
---|
版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/bcyy/291.html