在Dart中使用Mixins时,有没有办法解决钻石问题? 看看下面这个简单的例子:
class M1 {
String sayHello() => "hello M1";
}
class M2 {
String sayHello() => "hello M2";
}
class S {
String sayHello() => "hello S";
}
class C extends S with M1, M2 {}
main() {
C c = new C();
print(c.sayHello());
print((c as M1).sayHello());
}
输出:
hello M2
hello M2
如果你在c上调用“sayHello”,它取决于类声明中mixins的顺序 C,执行哪些实现。始终使用列表中最后一个mixin的实现。这几乎不是明确的,可能通常是偶然的。更糟糕的是:超类C的实现总是隐藏的。 类型转换不会改变一个东西,这当然符合Dart的一般理念,即运行时类型在执行代码时不起作用。如果有任何方法可以在不同的实现之间明确决定,那仍然会很好。有可能吗?
答案 0 :(得分:3)
简而言之:否。
您无法在Dart中解决钻石问题,因为Dart没有多重继承,因此它没有问题(或功能)。
在类之上添加mixins是完全正常的单继承,Dart类实现始终是一个到Object的链。 mixins唯一做的就是允许相同的成员出现在多个链中。
这也意味着无法访问链中较高的被覆盖成员。
您只能访问最顶层的声明,或者作为成员函数访问超链的最顶层声明(使用super.foo()
)。