擴充套件類
使用 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的contrastsetter 將引數型別從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 轉發規範。