重写类成员

子类可以重写实例方法、getter 和 setter。你可以使用 @override 注解来表明你想要重写一个成员:

class SmartTelevision extends Television { void turnOn() {...} // ··· }

要缩小一个方法参数或者实例变量的类型并写出 类型安全 的代码,你可以使用 covariant 关键词。

重载运算符

你可以重载下表中展示的运算符。比如,如果你定义一个 Vector(矢量)类,你可能会定义一个 + 方法来加两个矢量。

<+|[]
>/^[]=
<=~/&~
>=*<<==
-%>>

说明:你可能注意到 != 不是一个可重载的运算符。表达式 e1 != e2 仅仅是 !(e1 == e2) 的语法糖。

下面是一个重载 +- 运算符的例子:

class Vector { final int x, y; Vector(this.x, this.y); Vector operator +(Vector v) => Vector(x + v.x, y + v.y); Vector operator -(Vector v) => Vector(x - v.x, y - v.y); // 运算符 == 和 hasCode 没有展示。详情请看下面的说明 // ··· } void main() { final v = Vector(2, 3); final w = Vector(2, 2); assert(v + w == Vector(4, 5)); assert(v - w == Vector(0, 1)); }

如果你重载 ==,你也需要重载对象的 hashCode getter。。

noSuchMethod()

要检测或响应代码试图使用不存在的方法或实例变量的情况,你可以重写 noSuchMethod()

class A { // 除非你重写 noSuchMethod,不然使用 // 不存在的成员会引发 NoSuchMethodError void noSuchMethod(Invocation invocation) { print('You tried to use a non-existent member: ' + '${invocation.memberName}'); } }

不可以调用一个未实现的方法除非以下情况有一个成立:

  • 接收者有静态类型 dynamic
  • 接收者有一个定义了该未实现方法的静态类型(抽象也可),而且接收者的动态类型有不同于 ObjectnoSuchMethod() 的实现。

要了解更多信息,请参阅 noSuchMethod 跳转规范。