使用 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 转发规范。