扩展类
使用 extends
创建子类,并使用 super
引用超类
dart
class Television {
void turnOn() {
_illuminateDisplay();
_activateIrSensor();
}
// ···
}
class SmartTelevision extends Television {
void turnOn() {
super.turnOn();
_bootNetworkInterface();
_initializeMemory();
_upgradeApps();
}
// ···
}
有关 extends
的其他用法,请参阅泛型页面上关于参数化类型的讨论。
重写成员
#子类可以重写实例方法(包括运算符)、getter 和 setter。您可以使用 @override
注解来表明您有意重写一个成员。
dart
class Television {
// ···
set contrast(int value) {
...
}
}
class SmartTelevision extends Television {
@override
set contrast(num value) {
...
}
// ···
}
重写方法声明必须在几个方面与其重写的方法(或多个方法)匹配。
- 返回类型必须与被重写方法的返回类型相同(或为其子类型)。
- 参数类型必须与被重写方法的参数类型相同(或为其超类型)。在前面的示例中,
SmartTelevision
的contrast
setter 将参数类型从int
更改为超类型num
。 - 如果被重写方法接受 *n* 个位置参数,则重写方法也必须接受 *n* 个位置参数。
- 一个泛型方法不能重写非泛型方法,非泛型方法也不能重写泛型方法。
有时您可能希望缩小方法参数或实例变量的类型。这违反了正常规则,并且类似于向下转型,因为它可能在运行时导致类型错误。但是,如果代码能保证不会发生类型错误,则缩小类型是可能的。在这种情况下,您可以在参数声明中使用covariant
关键字。详情请参阅Dart 语言规范。
noSuchMethod()
#为了检测或响应代码尝试使用不存在的方法或实例变量的情况,您可以重写 noSuchMethod()
。
dart
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
。接收方具有定义未实现方法的静态类型(抽象类型可接受),并且接收方的动态类型具有与
Object
类中不同的noSuchMethod()
实现。
欲了解更多信息,请参阅非正式的noSuchMethod 转发规范。