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