跳到主要內容

擴充套件類

使用 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) {
    ...
  }
  // ···
}

重寫方法宣告必須在幾個方面與其重寫的方法(或多個方法)匹配。

  • 返回型別必須與被重寫方法的返回型別相同(或為其子型別)。
  • 引數型別必須與被重寫方法的引數型別相同(或為其超型別)。在前面的示例中,SmartTelevisioncontrast 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 轉發規範