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 extend A而不是implement

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 回答
-1

通过选择实现 A,即使您提供了默认实现,您也必须实现 A 所需的一切。如果您想使用 A 中的默认实现,同时可以灵活地提供您自己的实现,则必须将 A 用作mixin

class B with A {
  int get x => 3;
  int get y => 5;
}
于 2021-12-26T07:23:58.673 回答