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