扩展类
使用 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) {...}
// ···
}
重写方法声明必须在以下几个方面与它重写的 method(或 methods)匹配:
- 返回类型必须与重写方法的返回类型相同(或为其子类型)。
- 参数类型必须与重写方法的参数类型相同(或为其超类型)。在前面的示例中,
SmartTelevision
的contrast
setter 将参数类型从int
更改为超类型num
。 - 如果重写的方法接受 n 个位置参数,则重写的方法也必须接受 n 个位置参数。
- 泛型方法 不能重写非泛型方法,非泛型方法也不能重写泛型方法。
有时您可能想要缩小方法参数或实例变量的类型。这违反了正常的规则,并且类似于向下转型,因为它可能在运行时导致类型错误。尽管如此,如果代码可以保证不会发生类型错误,则可以缩小类型。在这种情况下,您可以在参数声明中使用 covariant
关键字 。有关详细信息,请参阅 Dart 语言规范 。
noSuchMethod()
#为了检测或响应代码尝试使用不存在的方法或实例变量的情况,您可以重写 noSuchMethod()
:
dart
class A {
// 除非您重写 noSuchMethod,否则使用不存在的成员会导致 NoSuchMethodError。
@override
void noSuchMethod(Invocation invocation) {
print('您尝试使用不存在的成员:${invocation.memberName}');
}
}
除非满足以下条件之一,否则您 无法调用 未实现的方法:
接收者的静态类型为
dynamic
。接收者的静态类型定义了未实现的方法(abstract 也可以),并且接收者的动态类型具有与类
Object
中的不同实现的noSuchMethod()
。
有关更多信息,请参阅非正式的 noSuchMethod 转发规范
除非另有说明,否则本网站上的文档反映的是 Dart 3.6.0。页面最后更新于 2025-02-05。 查看源代码 或 报告问题.