【问题标题】:What is the difference between a Squeak/Pharo Trait and a Newspeak Mixin?Squeak/Pharo Trait 和 Newspeak Mixin 有什么区别?
【发布时间】:2011-01-20 17:53:20
【问题描述】:

所以 Squeak/Pharo 支持 Traits 和 Newspeak 有 Mixins。有什么区别? Traits 没有 instVar,但 Mixins 有?

【问题讨论】:

    标签: smalltalk squeak pharo newspeak


    【解决方案1】:

    为了更好的比较以及为什么首选特质的原因,您可以查看traits paper (pdf)

    本质上就是Lukas Renggli所说的:

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

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

    由于 mixin 是线性化的,它们不会遭受臭名昭著的多重继承“钻石问题”。因此,它们堆叠在一起的脆弱性质是另一个问题,我将其称为“红宝石问题”,以与宝石隐喻保持一致。由于一些与moose 有关的奇怪原因,珍珠并不能像红宝石那样描述问题。

    【讨论】:

      【解决方案2】:

      特征是使用组合规则组合而成的。必须手动解决冲突,不会发生 trait 意外覆盖另一个同名方法的情况。

      mixin 是按顺序组成的,因此存在类似于多重继承的脆弱性问题。

      【讨论】:

      • 通常与多重继承相关的脆弱性是“钻石问题”——从多个类继承的具有相同名称和签名的方法没有确定性的解决方案。在 mixin 的情况下,正如您已经指出的那样,组合顺序决定了方法的解析方式,因此 mixins 不会遭受“钻石问题”。
      • 是的,但这是有偏见的。如果您从Mixin1Mixin2 中获得了m()n() 两种方法,那么您只能从一个mixin 中获得这两种方法。如果你想要Mixin1 的一种方法和Mixin2 的另一种方法,你就被卡住了。
      • 您所描述的不是所谓的“钻石问题”。我不确定这是否是一个问题 - mixin 应该代表可重用行为的最小单元,所以自然不能进一步分解......
      【解决方案3】:

      在Newspeak中,所有的类都是mixin。以下是 Gilad Bracha 在Newspeak discussion forum 中对类似问题的回答中的一些 sn-ps:

      Mixins 不是新话的特色 本身。也就是说,我们没有设计 语言说,好的,现在我们将添加 混入。 Mixins 自动退出 从类嵌套和基于消息 语义。也就是说,如果你有 虚拟类,你有 mixins 除非你真的禁止他们。 ...

      特征试图解决感知到的问题 mixin 的问题。

      1. 很少有实际经验表明这些 感知到的问题是真实的。
      2. 特征被限制为无状态。这简化了事情, 但并不处理所有情况 兴趣。其实现在有 试图添加的研究论文 状态到特征。

      特征完全被更多 通用模型,我设计了很多 几年前在我的博士论文中(可用 关闭我的网站,如果你真的想 深挖)。 ... 我想研究一下我们可以如何 将这些组合器合并到 新话。 ...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-10
        • 1970-01-01
        • 2011-02-04
        • 2011-11-22
        • 1970-01-01
        • 2017-11-13
        • 2019-09-02
        相关资源
        最近更新 更多