Mixins与性状

Mixins和Traits有什么不同?

根据维基百科 ,Ruby模块有点像特质。 怎么会这样?

  1. Mixins可能包含状态,(传统)特性不包含。
  2. Mixins使用“隐式冲突解决”,特征使用“显式冲突解决”
  3. Mixins依赖线性化,性状变平。

关于特质的讲座

广告1.在mixin中,您可以定义实例variables。 性状不允许这样做。 国家必须由组成class级(=使用特质的class级)

广告2.可能有名字冲突。 两个mixin( MAMB )或traits( 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' } } 

在mixins中,混合类C mixins MA, MB中的冲突被隐含地解决。

 Class C mixins MA, MB { bar():void { foo(); } } 

这将从MA调用foo():void

另一方面,在使用特质的时候,写作课必须解决冲突。

 Class C mixins TA, TB { bar():void { foo(); } } 

这段代码会引发冲突( foo():void两个定义)。

广告3.一个方法的语义不取决于它是在特质还是在使用特质的类中定义的。

换句话说,这个类是由Traits还是Traits代码“复制 – 粘贴”到类中并不重要。

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

http://dlang.org/mixin.html

http://dlang.org/traits.html

在这种情况下,Mixin是在编译时生成的代码,然后在编译期间在代码中插入。 简单的DSLs非常方便。

特征是编译时的外部值(而不是从外部源生成的代码)。 差别是微妙的。 Mixins添加逻辑,Traits添加编译时types信息等数据。

不太了解Ruby,但希望这有些帮助。

Interesting Posts