上代码
abstract class BaseClass {
funcPrint() {
print("BaseClass\n");
}
}
mixin A on BaseClass {
funcPrint() {
print("A\n");
super.funcPrint();
}
}
mixin B on BaseClass {
funcPrint() {
print("B\n");
super.funcPrint();
}
}
class C extends BaseClass {
funcPrint() {
print("C\n");
super.funcPrint();
}
}
class D extends C with A, B {
}
testMixin() {
D d = D();
d.funcPrint();
}
执行testMixin方法的打印结果:
B
A
C
BaseClass
是不是很懵???
好, 现在我们把上面代码里关于super的调用都注掉, 重新运行, 打印结果是什么呢?
abstract class BaseClass {
funcPrint() {
print("BaseClass\n");
}
}
mixin A on BaseClass {
funcPrint() {
print("A\n");
//super.funcPrint();
}
}
mixin B on BaseClass {
funcPrint() {
print("B\n");
//super.funcPrint();
}
}
class C extends BaseClass {
funcPrint() {
print("C\n");
//super.funcPrint();
}
}
class D extends C with A, B {
}
testMixin() {
D d = D();
d.funcPrint();
}
结果是:
B
关于 mixin 你可能知道: 相同方法会被覆盖,并且 with 末尾的会覆盖前面的。
但是 mixin 后的 super 是谁呢?
mixin 最终会生成一个继承链, 下面这样
从下到上, 一级一级继承关系, 图片上很清楚的看到 class 对应的 super 是谁了.
现在打开 super 调用, 是不是就明白这个调用顺序了呢.