【发布时间】:2010-10-29 20:43:34
【问题描述】:
Mixins 和 Traits 有什么区别?
According to Wikipedia,Ruby 模块有点像特征。怎么样?
【问题讨论】:
标签: multiple-inheritance mixins paradigms traits
Mixins 和 Traits 有什么区别?
According to Wikipedia,Ruby 模块有点像特征。怎么样?
【问题讨论】:
标签: multiple-inheritance mixins paradigms traits
广告 1. 在 mixins 中,您可以定义实例变量。特性不允许这样做。必须通过组合类来提供状态(=使用特征的类)
广告 2.
可能存在名称冲突。两个 mixin(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();
}
}
这将从MA调用foo():void
另一方面,在使用 Traits 时,组合类必须解决冲突。
Class C mixins TA, TB {
bar():void {
foo();
}
}
此代码会引发冲突(foo():void 的两个定义)。
广告 3. 方法的语义不取决于它是定义在 trait 中还是在使用该 trait 的类中。
换句话说,无论类是由 Traits 组成还是 Traits 代码被“复制 - 粘贴”到类中都没有关系。
【讨论】:
这些页面解释了 D 编程语言的区别。
此上下文中的 Mixin 是动态生成的代码,然后在编译期间插入到代码中。对于简单的 DSL 来说非常方便。
特征是编译时的外部值(而不是从外部源生成的代码)。差异是微妙的。 Mixins 添加逻辑,Traits 添加编译时类型信息等数据。
对 Ruby 了解不多,但希望对您有所帮助。
【讨论】: