Squeak/Pharo Trait和Newspeak Mixin有什么区别?

17

Squeak/Pharo支持Traits,而Newspeak则支持Mixins。两者有何区别?Traits没有实例变量,但是Mixins有吗?

3个回答

11

为了更好地比较和说明为什么首选特征,您可以查看特征论文(pdf)

本质上,就像Lukas Renggli所说:

特征成员被组合到一个类中,并且不改变其继承层次结构。冲突必须由特征的用户明确解决。

混合成员被线性化到目标类的继承层次结构中。如果存在冲突成员,则声明它们的顺序决定哪个成员被调用。这是脆弱的,因为它隐含地定义了组合的行为,类的作者必须意识到潜在的冲突及其对结果类的影响。

由于混合成员被线性化,它们不会遭受多重继承的臭名昭著的"钻石问题"。因此,它们堆叠的脆弱性是另一个问题,我将其称为"红宝石问题",以保持与珍贵石头的比喻一致。出于某些与moose有关的奇怪原因,珍珠并不能很好地描述这个问题,而红宝石可以。


9

特征是使用组合规则进行组合的。冲突必须手动解决,不能发生特征意外覆盖另一个具有相同名称的方法的情况。

混入是按顺序组合的,因此存在与多重继承类似的脆弱性问题。


1
与多重继承通常相关的脆弱性是“钻石问题” - 没有确定性地解决从多个类继承的具有相同名称和签名的方法。在混合中,正如您已经注意到的那样,组合顺序决定了如何解析方法,因此混合不会受到“钻石问题”的影响。 - Yardena
2
是的,它们确实会这样做,但是有偏见。如果您从Mixin1Mixin2中获取两种方法m()n(),那么您只能从一个mixin中获得两种方法。如果您想要从Mixin1获取一种方法并从Mixin2获取另一种方法,则无法实现。 - Damien Pollet
2
你所描述的并不是众所周知的“钻石问题”。我不确定这是否是一个问题 - mixin 应该代表一种最小的可重用行为单元,因此自然而然地它不能再被分解了... - Yardena

9
在Newspeak中,所有的类都是mixin。以下是Gilad Bracha在Newspeak讨论论坛上回答类似问题时的一些片段:
“Mixin不是Newspeak本身的特性。也就是说,我们设计语言时并没有说,好的,现在我们要添加mixin。mixin是从类嵌套和基于消息的语义自动衍生出来的。也就是说,如果你有虚拟类,除非你明确禁止,否则你就有mixin...”
“Traits试图解决mixin所存在的问题。”
- 很少有真正的经验表明这些问题是真实存在的。 - Traits被限制为无状态。这简化了问题,但并不能处理所有感兴趣的情况。事实上,现在有研究论文试图向traits添加状态。
“Traits完全被我在多年前的博士论文中提出的更一般的模型所包含(如果你真的想深入挖掘,可以从我的网站上获取)......我希望探讨如何将这些组合器整合到Newspeak中。”

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接