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

Ric*_*urr 16 smalltalk squeak pharo newspeak

所以Squeak/Pharo支持Traits和Newspeak有Mixins.有什么不同?特质没有instVars但是Mixins有吗?

Luk*_*gli 9

特征是使用组合规则组成的.冲突必须手动解决,特征不会意外地覆盖具有相同名称的另一个方法.

Mixins由顺序组成,因此具有类似于多重继承的脆弱性问题.

  • 是的,他们这样做,但它是有偏见的.如果你从'Mixin1`和`Mixin2`中得到两个方法`m()`和`n()`,那么你只能从一个mixin中获得两个方法.如果你想要一个来自`Mixin1`的方法和另一个来自'Mixin2`的方法,你就会陷入困境. (2认同)
  • 你所描述的不是所谓的“钻石问题”。我不确定这是否是一个问题 - mixin 应该代表可重用行为的最小单元,所以自然它不能进一步分解...... (2认同)

Jor*_*dão 9

为了进行良好的比较,并推断为什么特征是首选的,你可以查看特征论文(pdf).

从本质上讲,这就是Lukas Renggli所说的:

Traits成员组成一个类,不更改其继承层次结构.冲突必须由特征的用户明确解决.

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

由于mixins被线性化,它们不会遭受多重继承的臭名昭着的" 钻石问题 ".因此,它们堆积的脆弱性是另一个问题,我将其称为" 红宝石问题 ",以保持宝石的比喻.由于与驼鹿有关的一些奇怪的原因,珍珠并没有描述问题以及红宝石.


Yar*_*ena 8

在Newspeak中,所有课程都是mixins.以下是Gilad Bracha在Newspeak论坛中回答类似问题的一些片段:

Mixins本身并不是Newspeak的特色.也就是说,我们没有设计语言说,好吧,现在我们将添加mixins.Mixins自动从类嵌套和基于消息的语义中脱离出来.也就是说,如果您有虚拟课程,那么除非您实际禁止它们,否则您将拥有mixins....

特征试图解决混合素的感知问题.

  1. 几乎没有真正的经验表明这些感知到的问题是真实存在的.
  2. 特征被限制为无国籍.这简化了问题,但并未处理所有感兴趣的案例.事实上,现在有研究论文试图将状态添加到特征中.

特征完全被一个更普遍的模型所包含,我多年前在我的博士论文中设计过(如果你真的想深入研究,可以在我的网站上找到)....我想研究一下如何将这些组合器合并到Newspeak中....