重写类的成员
最后更新于:2022-04-02 04:59:12
[TOC]
## 重写类的成员
子类可以覆盖实例方法、getter和setter。您可以使用@override注释来指示你重写了某个成员方法:
~~~
class SmartTelevision extends Television {
@override
void turnOn() {...}
// ···
}
~~~
要在类型安全的代码中缩小方法参数或实例变量的类型,可以使用covariant关键字。
## 重写操作符
您可以重写下表中显示的操作符。例如,如果定义一个Vector类,可以定义一个+方法来让两个向量相加。
| < | + | \| | [] |
| --- | --- | --- | --- |
| > | / | ^ | []= |
| <= | ~/ | & | ~ |
| >= | * | << | == |
| - | % | >> | |
下例在类中重写了+和-操作符:
~~~
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);
// Operator == and hashCode not shown. For details, see note below.
// ···
}
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。有关override == 和hashCode的示例,请参见[ Implementing map keys]。
有关重写的更多信息,请参见[扩展类]。
## noSuchMethod()
可以重写noSuchMethod()方法来处理程序访问一个不存在的方法或者成员变量:
~~~
class A {
// Unless you override noSuchMethod, using a
// non-existent member results in a NoSuchMethodError.
@override
void noSuchMethod(Invocation invocation) {
print('You tried to use a non-existent member: ' +
'${invocation.memberName}');
}
}
~~~
您不能调用未实现的方法,除非下列任何一个是正确的:
* 被调用者有静态方法dynamic
* 被调用者有一个静态类型来定义未实现的方法(抽象也可以OK),而接收者的动态类型有一个noSuchMethod()的实现,它与类对象中的方法不同。
更多信息,请参见[noSuchMethod转发规范]
';