混合与特质

Mixins 和 Traits 有什么不同?

根据 Wikipedia ,Ruby 模块有点像特征,为什么呢?

30465 次浏览

这些页面解释了 D 编程语言的不同之处。

Http://dlang.org/mixin.html

Http://dlang.org/traits.html

此上下文中的 Mixin 是动态生成的代码,然后在编译期间插入到代码中的该点。对于简单的 DSL 来说非常方便。

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

我对 Ruby 了解不多,但希望这能有所帮助。

  1. 混合蛋白可能包含状态,(传统的)特征不包含状态。
  2. 混合使用“隐式冲突解决”,trait 使用“显式冲突解决”
  3. 混合依赖于线性化,性状是扁平的。

关于特质的讲座

广告1。 在 Mixin 中,可以定义实例变量。特质不允许这样。状态必须由组合类(= 使用 trait 的类)提供

广告2。 可能会有名字冲突。两个混合子(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'
}
}

在混合中,组合类 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 代码“复制粘贴”到类中并不重要。