Carbon语言 继承与抽象

Carbon只支持单继承,不支持多重继承。值得注意的是普通的class关键字定义的类型默认都是final的,即不能被继承生成子类。但 abstrct class 和 base class 关键字定义的类型可以被继承。

// 抽象类(abstract class)不能被实例化,因为其中可能包含抽象方法
abstract class UIWidget {
  // 抽象方法(abstract fn)没有实现
  abstract fn Draw[me: Self](s: Screen);
  abstract fn Click[addr me: Self*](x: i32, y: i32);
}

// base class 允许扩展和实例化 
base class Button extends UIWidget {
  // 实现抽象方法
  impl fn Draw[me: Self](s: Screen) { ... }
  impl fn Click[addr me: Self*];

  // 新增了一个虚函数(virtual fn)
  virtual fn MoveTo[addr me: Self*](x: i32, y: i32);
}

// 类外实现方法
fn Button.Click[addr me: Self*](x: i32, y: i32) { ... }
fn Button.MoveTo[addr me: Self*](x: i32, y: i32) { ... }

class ImageButton extends Button {
  ...
}

abstrct class 就是抽象类,它不能被实例化,因为其中有抽象方法。抽象类与抽象方法的概念和Java类似。抽象方法等同于C++中的纯虚函数。

base class不仅是可以被继承(扩展)的类,还能实例化。因为它里面不会有抽象方法,所有继承而来的抽象方法都要被实现。

base class中也能用virtual修饰成员函数,这个语法是从C++中的虚函数而来的。

泛型接口用于做泛型代码的类型检查。interface Summary { fn Summarize[me: Self]() -> String;}这个interface不是Java中的 interface,而 ...