Kap*_*old 146 paradigms multiple-inheritance traits mixins
Mixins和Traits有什么区别?
根据维基百科,Ruby模块有点像特征.怎么会这样?
jk_*_*jk_ 209
ad 1. 在mixins中,您可以定义实例变量.特征不允许这样.状态必须由组成类(=使用特征的类)提供
广告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'
}
}
Run Code Online (Sandbox Code Playgroud)
在mixins中,C mixins MA, MB
隐式地解决了编写类中的冲突.
Class C mixins MA, MB {
bar():void {
foo();
}
}
Run Code Online (Sandbox Code Playgroud)
这将foo():void
来自MA
另一方面,在使用Traits时,编写类必须解决冲突.
Class C mixins TA, TB {
bar():void {
foo();
}
}
Run Code Online (Sandbox Code Playgroud)
此代码将引发冲突(两个定义foo():void
).
ad 3. 方法的语义不取决于它是在特征中定义还是在使用特征的类中定义.
换句话说,无论何时该类由Traits组成,Traits代码都是"复制粘贴"到类中.
这些页面解释了D编程语言的不同之处.
此上下文中的Mixins是动态生成的代码,然后在编译期间在代码中插入.对于简单的DSL来说非常方便.
特征是编译时外部值(而不是从外部源生成的代码).差异很微妙.Mixins添加逻辑,Traits添加编译时类型信息等数据.
不太了解Ruby,但希望这有点帮助.