Mixins vs.特质


Answers:


214
  1. Mixins可能包含状态,(传统)特征不包含。
  2. Mixins使用“隐式冲突解决方案”,特征使用“显式冲突解决方案”
  3. Mixins依赖于线性化,特征被展平。

关于性状的讲座

广告1. 在mixins中,您可以定义实例变量。特质不允许这样做。必须通过组成类来提供状态(=使用特征的类)

广告2. 可能存在名称冲突。两个mixin(MAMB)或特征(TATB)定义的方法具有相同的定义foo():void

Mixin MA {
    foo():void {
        print 'hello'
    }
}

Mixin MB {
    foo():void {
        print 'bye'
    }
}

Trait TA {
    foo():void {
        print 'hello'
    }
}

Trait TB {
    foo():void {
        print 'bye'
    }
}

在mixin中,C mixins MA, MB 隐式解决了组成类中的冲突。

Class C mixins MA, MB {
    bar():void {
        foo();
    }
}

这会foo():voidMA

另一方面,在使用“特质”时,编写类必须解决冲突。

Class C mixins TA, TB {
    bar():void {
        foo();
    }
}

此代码将引发冲突(的两个定义foo():void)。

ad 3. 方法的语义不取决于它是在特征中定义还是在使用该特征的类中定义。

换句话说,该类由Traits组成还是将Traits代码“复制-粘贴”到该类中都没有关系。


5
我知道已经过了一年了,但是对于将来的读者来说,在ruby中,它将使用混入的最后一个模块中的方法,因此将其称为foo(),形式为MB
rik.vanmechelen

4
在Scala特质中可以有字段,这意味着它们不是“传统”特质吗?
塞尔吉奥2012年

4
是的,这些不是“传统”特征,它们被称为“全状态”特征。有状态的特性和混入的区别是点2和3
jk_

7
暂定-1; 在野外使用“性状”和“混合素”一词的方式是高度不一致的,这里至少有一点是错误的。PHP和Wikipedia(根据@Sergio,也是Scala的说法)不同意无状态特征。我认为这个答案没有用处,因为它是由简单的断言组成的,而且我不清楚这还不只是您个人使用这些词的方式。否则,我需要查看许多示例,说明如何在现实世界中(例如,在真实的编程语言中)使用这些术语来支持您的主张。
Mark Amery 2014年

3
@AykutKllic线性化->“编译器无歧义地解决了超级是什么的问题。” (ibm.com/developerworks/library/j-jn8

9

这些页面解释了D编程语言的区别。

http://dlang.org/mixin.html

http://dlang.org/traits.html

在这种情况下,混入是动态生成的代码,然后在编译过程中将其插入到代码中。对于简单的DSL非常方便。

特性是编译时的外部值(而不是从外部源生成的代码)。区别是微妙的。混合增加逻辑,特性增加诸如编译时类型信息之类的数据。

对Ruby不太了解,但希望这会有所帮助。


41
D中的Mixins和Traits与计算机科学中的术语完全不同。在D中,两者都是用于自动代码生成的预处理器原语。在其他语言中,它们是继承机制。D中的命名决定很不幸。
tylerl 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.