混合类和特质在IT技术中有什么区别?
根据维基百科的解释,Ruby模块有点像特质。这是怎么回事?
ad 1. 在mixins中,您可以定义实例变量。Traits不允许这样做。状态必须由组合类(即使用traits的类)提供。
ad 2.
可能存在名称冲突。两个mixins(MA
和MB
)或traits(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'
}
}
在 mixin 中,组合类 C mixins MA, MB
的冲突是隐式解决的。
Class C mixins MA, MB {
bar():void {
foo();
}
}
这将从MA
调用foo():void
另一方面,使用Trait时,组合类必须解决冲突。
Class C mixins TA, TB {
bar():void {
foo();
}
}
这段代码会引发冲突(定义了两个 foo():void
)。
ad 3. 一个方法的语义不取决于它是在 trait 中定义还是在使用 trait 的类中定义。
换句话说,无论类是否由 Traits 组成,或者 Traits 代码被“复制粘贴”到类中,都没有关系。