gpt4 book ai didi

Dart:如何使用 mixins 解决菱形模式?

转载 作者:行者123 更新时间:2023-12-03 02:51:37 25 4
gpt4 key购买 nike

在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,执行了哪个实现。始终使用列表中最后一个混入的实现。这几乎不是明确的,并且通常可能是偶然的。更糟的是:父类(super class) C 的实现总是隐藏的。类型转换不会改变任何东西,这当然符合 Dart 的一般哲学,即运行时类型在执行代码时不会起作用。如果有任何方法可以在不同的实现之间明确做出决定,那将是一件好事。有这种可能吗?

最佳答案

简而言之:没有。

你不能在 Dart 中解决菱形问题,因为 Dart 没有多重继承,所以它没有问题(或特征)。

在一个类之上添加 mixin 是完全正常的单继承,Dart 类实现始终是向下到 Object 的单链。mixins 做的唯一一件事就是允许相同的成员出现在多个链中。

这也意味着无法访问链中更高层的被覆盖成员。您只能访问最顶层的声明,或者作为成员函数访问 super 链的最顶层声明(使用 super.foo())。

关于Dart:如何使用 mixins 解决菱形模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24534106/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com