所以 Squeak/Pharo 支持 Traits,Newspeak 有 Mixins。有什么不同?Traits 没有 instVars 但 Mixins 有?
3 回答
为了进行良好的比较以及为什么首选特征的原因,您可以查看特征论文 (pdf)。
本质上,这就是Lukas Renggli所说的:
特征成员组成一个类,并且不改变其继承层次。冲突必须由特征的用户明确解决。
Mixin 被线性化到目标类的继承层次结构中。如果存在冲突的成员,则声明它们的顺序决定了调用哪个成员。这是脆弱的,因为它隐含地定义了组合的行为,并且类作者必须意识到潜在的冲突以及它们将如何影响生成的类。
由于 mixin 是线性化的,因此它们不会遭受臭名昭著的多重继承“钻石问题”。因此,它们堆叠在一起的脆弱性是另一个问题,我将其称为“红宝石问题”,以与宝石隐喻保持一致。由于一些与驼鹿有关的奇怪原因,珍珠不像红宝石那样描述了这个问题。
特征是使用组合规则组合而成的。必须手动解决冲突,不会发生 trait 意外覆盖另一个同名方法的情况。
Mixin 是按顺序组成的,因此存在类似于多重继承的脆弱性问题。
在Newspeak中,所有的类都是mixin。以下是 Gilad Bracha 在Newspeak 论坛中对类似问题的回答中的一些片段:
Mixins 本身并不是Newspeak 的一个特性。也就是说,我们没有设计语言说,好的,现在我们将添加 mixins。Mixins 自动脱离了类嵌套和基于消息的语义。也就是说,如果你有虚拟类,除非你真的禁止它们,否则你就有了 mixins。...
Traits 试图解决 mixin 的感知问题。
- 很少有实际经验表明这些感知到的问题是真实的。
- 特征被限制为无国籍。这简化了事情,但不能处理所有感兴趣的情况。事实上,现在有一些研究论文试图将状态添加到特征中。
特征完全包含在一个更通用的模型中,这是我多年前在我的博士论文中设计的(如果你真的想深入挖掘,可以从我的网站上获得)。...我想研究一下我们如何将这些组合器合并到新话中。...