メインコンテンツにスキップ

クラスの拡張

サブクラスを作成するにはextendsを、スーパークラスを参照するにはsuperを使用します。

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

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

extendsの別の使用方法については、Genericsページのパラメータ化された型の制限の議論を参照してください。

メンバーのオーバーライド

#

サブクラスは、インスタンスメソッド(演算子を含む)、getter、およびsetterをオーバーライドできます。@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である。

  • レシーバの静的型が、実装されていないメソッド(abstractでも可)を定義しており、レシーバの動的型がObjectクラスのnoSuchMethod()とは異なるnoSuchMethod()の実装を持っている。

詳細については、非公式のnoSuchMethodフォワーディング仕様を参照してください。