重写类成员 3个月前

编程语言
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
  • 接收者有一个定义了该未实现方法的静态类型(抽象也可),而且接收者的动态类型有不同于 ObjectnoSuchMethod() 的实现。

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

image
EchoEcho官方
无论前方如何,请不要后悔与我相遇。
1377
发布数
439
关注者
2222624
累计阅读

热门教程文档

Vue
25小节
CSS
33小节
Djiango
17小节
QT
33小节
Maven
5小节