目次

クラスの拡張

サブクラスを作成するには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転送仕様を参照してください。