编程语言
841
子类可以重写实例方法、getter 和 setter。你可以使用 @override 注解来表明你想要重写一个成员:
class SmartTelevision extends Television { @override 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 @override void noSuchMethod(Invocation invocation) { print('You tried to use a non-existent member: ' + '${invocation.memberName}'); } }
你不可以调用一个未实现的方法除非以下情况有一个成立:
- 接收者有静态类型 dynamic。
- 接收者有一个定义了该未实现方法的静态类型(抽象也可),而且接收者的动态类型有不同于 Object 类 noSuchMethod() 的实现。
要了解更多信息,请参阅 noSuchMethod 跳转规范。