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

無効な_実装_オーバーライド

'{1}.{0}' ('{2}') は '{3}.{0}' ('{4}') の有効な具象実装ではありません。

セッター '{1}.{0}' ('{2}') は '{3}.{0}' ('{4}') の有効な具象実装ではありません。

説明

#

アナライザーは、次のすべてが true の場合にこの診断を生成します。

  • クラスが抽象メンバーを定義しています。
  • スーパークラスにそのメンバーの具象実装があります。
  • 具象実装は、抽象メソッドの有効な実装ではありません。

具象実装は、戻り値の型、メソッドのパラメータの型、または型パラメータの互換性のために無効になる可能性があります。

#

次のコードは、メソッド A.addint 型のパラメータを持っており、オーバーライドするメソッド B.add が対応する num 型のパラメータを持っているため、この診断を生成します。

dart
class A {
  int add(int a) => a;
}
class B extends A {
  int add(num a);
}

これは、次のような B.add の呼び出しで問題になります。

dart
void f(B b) {
  b.add(3.4);
}

B.add は、たとえば double を受け取ることができると期待していますが、メソッド A.add が実行されるとき (add の唯一の具象実装であるため)、doubleint 型のパラメータに代入できないため、実行時例外がスローされます。

一般的な修正

#

サブクラスのメソッドがスーパークラスの実装に準拠できる場合は、サブクラスの宣言を変更します (同じ場合は削除します)。

dart
class A {
  int add(int a) => a;
}
class B	extends A {
  int add(int a);
}

スーパークラスのメソッドがサブクラスのメソッドの有効な実装に一般化できる場合は、スーパークラスのメソッドを変更します。

dart
class A {
  int add(num a) => a.floor();
}
class B	extends A {
  int add(num a);
}

スーパークラスのメソッドもサブクラスのメソッドも変更できない場合は、サブクラスにメソッドの具象実装を提供します。

dart
class A {
  int add(int a) => a;
}
class B	extends A {
  int add(num a) => a.floor();
}