提供抽象类中方法的默认实现

use*_*952 4 dart

在下面的示例中,我希望sum getter将返回8,但这是一个编译错误。

Class 'B' has no instance getter 'sum'.
Run Code Online (Sandbox Code Playgroud)

根据规格:

使用抽象类而不是接口具有重要的优势。抽象类可以提供默认的实现。它还可以提供静态方法,从而消除了对服务类(如集合或列表)的需要,它们的全部目的是对与给定类型相关的实用程序进行分组。

提供加和x和y的和的默认实现的正确方法是什么?

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?
}
Run Code Online (Sandbox Code Playgroud)

Ale*_*uin 6

您必须进行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
}
Run Code Online (Sandbox Code Playgroud)

另外,如果由于类可能已经扩展了另一个类而不想使用扩展,则可以使用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
}
Run Code Online (Sandbox Code Playgroud)