Squeak/Pharo支持Traits,而Newspeak则支持Mixins。两者有何区别?Traits没有实例变量,但是Mixins有吗?
为了更好地比较和说明为什么首选特征,您可以查看特征论文(pdf)。
本质上,就像Lukas Renggli所说:
特征成员被组合到一个类中,并且不改变其继承层次结构。冲突必须由特征的用户明确解决。
混合成员被线性化到目标类的继承层次结构中。如果存在冲突成员,则声明它们的顺序决定哪个成员被调用。这是脆弱的,因为它隐含地定义了组合的行为,类的作者必须意识到潜在的冲突及其对结果类的影响。
由于混合成员被线性化,它们不会遭受多重继承的臭名昭著的"钻石问题"。因此,它们堆叠的脆弱性是另一个问题,我将其称为"红宝石问题",以保持与珍贵石头的比喻一致。出于某些与moose有关的奇怪原因,珍珠并不能很好地描述这个问题,而红宝石可以。
特征是使用组合规则进行组合的。冲突必须手动解决,不能发生特征意外覆盖另一个具有相同名称的方法的情况。
混入是按顺序组合的,因此存在与多重继承类似的脆弱性问题。
Mixin1
和Mixin2
中获取两种方法m()
和n()
,那么您只能从一个mixin中获得两种方法。如果您想要从Mixin1
获取一种方法并从Mixin2
获取另一种方法,则无法实现。 - Damien Pollet