Mixins和Traits有什么区别?
According to Wikipedia,Ruby模块有点像特性。为何如此?
最佳答案
Lecture about traits
广告1.
在mixins中,您可以定义实例变量。特质不允许这样做。必须通过构成类(=使用类的类)来提供状态
广告2.
可能存在名称冲突。两个混合(
MA
和MB
)或特征(TA
和TB
)定义了具有相同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'
}
}
在mixins中,隐式解决了组成类
C mixins MA, MB
的冲突。Class C mixins MA, MB {
bar():void {
foo();
}
}
这将从
foo():void
调用MA
另一方面,在使用“特质”时,编写类必须解决冲突。
Class C mixins TA, TB {
bar():void {
foo();
}
}
此代码将引发冲突(
foo():void
的两个定义)。广告3.
方法的语义不取决于它是在特征中定义还是在使用该特征的类中定义。
换句话说,该类由Traits组成还是将Traits代码“复制-粘贴”到该类中都没有关系。
关于multiple-inheritance - Mixins vs.特质,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/925609/