內容

使用 extends 建立子類別,並使用 super 參照超類別

dart
class Television {
  void turnOn() {
    _illuminateDisplay();
    _activateIrSensor();
  }
  // ···
}

class SmartTelevision extends Television {
  void turnOn() {
    super.turnOn();
    _bootNetworkInterface();
    _initializeMemory();
    _upgradeApps();
  }
  // ···
}

如需 extends 的其他用法,請參閱泛型頁面中 參數化型別 的說明。

覆寫成員

#

子類別可以覆寫實例方法(包括 運算子)、取得器和設定器。您可以使用 @override 註解來表示您有意覆寫成員

dart
class Television {
  // ···
  set contrast(int value) {...}
}

class SmartTelevision extends Television {
  @override
  set contrast(num value) {...}
  // ···
}

覆寫方法宣告必須在幾個方面與它所覆寫的方法(或方法)相符

  • 傳回型別必須與覆寫方法的傳回型別相同(或為其子型別)。
  • 參數型別必須與覆寫方法的參數型別相同(或為其超型別)。在前面的範例中,SmartTelevisioncontrast 設定器將參數型別從 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 轉發規範