关于Mixin和Class Dart的继承

时间:2019-05-24 07:05:20

标签: dart flutter

请查看代码,我想知道 1.谁是C超 2.在C类中,当我调用'super.method()'时,Mixin执行'void method()'(所以C的super是Mixin?),然后当执行'super.method()'时,B执行' void method()'(所以C的超级是B?),为什么?

它正在运行Dart 2.1.2

void main() {
  C().printSuper();
  C().method();
}

abstract class A {
  void method() {
    print("A");
  }
}

class B implements A {
  @override
  void method() {
    print("B");
  }
}

mixin Mixin on A {
  @override
  void method() {
    super.method();
    print("mixin");
  }
}

class C extends B with Mixin {
  void printSuper() {
    super.method();
  }
}



print message:

I/flutter (21340): B
I/flutter (21340): mixin
I/flutter (21340): B
I/flutter (21340): mixin

我希望输出打印消息:

I /颤振(21340):B I /颤振(21340):B I / flutter(21340):混入

1 个答案:

答案 0 :(得分:0)

C的超类是B with Mixin,它是extends B with Mixin子句引入的匿名类。

C等效于声明如下的类:

class _BwithMixin extends B implements Mixin {
  void method() {
    super.method();
    print("mixin");
  }
}
class C extends _BwithMixin {
  void printSuper() {
    super.method();
  }
}

因此,printSuper不会直接命中method的{​​{1}},而是命中了B的超类{{{ 1}},而该方法就是从method复制的方法。然后它将从C调用B with Mixin,并且它的超类是Mixin,因此它将首先打印super.method(),然后打印_BwithMixin