10

以下の例では、 sum getter が 8 を返すことを期待していましたが、これはコンパイル エラーです。

Class 'B' has no instance getter 'sum'.

仕様によると:

インターフェイスの代わりに抽象クラスを使用すると、重要な利点があります。抽象クラスはデフォルトの実装を提供できます。また、静的メソッドを提供することもできるため、特定のタイプに関連するユーティリティをグループ化することを全体の目的とするコレクションやリストなどのサービス クラスが不要になります。

x と y を加算する sum の既定の実装を提供する正しい方法は何ですか?

abstract class A {
  int get x;
  int get y;
  int get sum => x+y;
}

class B implements A {
  int get x => 3;
  int get y => 5;
}

main() {
  B b = new B();
  print(b.x);
  print(b.sum); // Not working, why not 8?
}
4

2 に答える 2

13

実装の代わりにB 拡張 する必要があります。A

abstract class A {
  int get x;
  int get y;
  int get sum => x+y;
}

class B extends A {
  int get x => 3;
  int get y => 5;
}

main() {
  B b = new B();
  print(b.x);
  print(b.sum); // displays 8
}

または、クラスが既に他のクラスを拡張している可能性があるためにextendsを使用したくない場合は、 mixinsを使用できます。

abstract class M {
  int get x;
  int get y;
  int get sum => x+y;
}

class A {
  String s = "s";
}
class B extends A with M {
  int get x => 3;
  int get y => 5;
}

main() {
  B b = new B();
  print(b.s);
  print(b.x);
  print(b.sum); // displays 8
}
于 2013-07-22T13:58:12.630 に答える