クラスの拡張
サブクラスを作成するにはextends
を使用し、スーパークラスを参照するにはsuper
を使用します。
class Television {
void turnOn() {
_illuminateDisplay();
_activateIrSensor();
}
// ···
}
class SmartTelevision extends Television {
void turnOn() {
super.turnOn();
_bootNetworkInterface();
_initializeMemory();
_upgradeApps();
}
// ···
}
extends
の別の使用方法については、ジェネリクスページのパラメータ化された型の説明を参照してください。
メンバーのオーバーライド
#サブクラスは、インスタンスメソッド(演算子を含む)、ゲッター、セッターをオーバーライドできます。 @override
アノテーションを使用して、意図的にメンバーをオーバーライドしていることを示すことができます。
class Television {
// ···
set contrast(int value) {...}
}
class SmartTelevision extends Television {
@override
set contrast(num value) {...}
// ···
}
オーバーライドするメソッドの宣言は、いくつかの点でオーバーライドされるメソッド(またはメソッド群)と一致する必要があります。
- 戻り値の型は、オーバーライドされるメソッドの戻り値の型と同じ型(またはサブタイプ)である必要があります。
- パラメータの型は、オーバーライドされるメソッドのパラメータの型と同じ型(またはスーパータイプ)である必要があります。上記の例では、
SmartTelevision
のcontrast
セッターは、パラメータの型をint
からスーパータイプのnum
に変更しています。 - オーバーライドされるメソッドが *n* 個の位置パラメータを受け入れる場合、オーバーライドするメソッドも *n* 個の位置パラメータを受け入れる必要があります。
- ジェネリックメソッドは非ジェネリックメソッドをオーバーライドできず、非ジェネリックメソッドはジェネリックメソッドをオーバーライドできません。
メソッドパラメータまたはインスタンス変数の型を狭めたい場合があります。これは通常のルールに違反しており、実行時に型エラーが発生する可能性があるという点でダウンキャストに似ています。それでも、コードが型エラーが発生しないことを保証できる場合は、型の絞り込みが可能です。この場合、パラメータ宣言でcovariant
キーワードを使用できます。詳細については、Dart言語仕様を参照してください。
noSuchMethod()
#コードが存在しないメソッドまたはインスタンス変数を使用しようとした場合に検出または反応するには、noSuchMethod()
をオーバーライドします。
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転送仕様を参照してください。
特に明記されていない限り、このサイトのドキュメントはDart 3.5.3を反映しています。ページの最終更新日:2024年4月11日。 ソースを表示 または 問題を報告する。