Mixins与性状
Mixins和Traits有什么不同?
根据维基百科 ,Ruby模块有点像特质。 怎么会这样?
- Mixins可能包含状态,(传统)特性不包含。
- Mixins使用“隐式冲突解决”,特征使用“显式冲突解决”
- Mixins依赖线性化,性状变平。
关于特质的讲座
广告1.在mixin中,您可以定义实例variables。 性状不允许这样做。 国家必须由组成class级(=使用特质的class级)
广告2.可能有名字冲突。 两个mixin( 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' } }
在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编程语言的不同之处。
在这种情况下,Mixin是在编译时生成的代码,然后在编译期间在代码中插入。 简单的DSLs非常方便。
特征是编译时的外部值(而不是从外部源生成的代码)。 差别是微妙的。 Mixins添加逻辑,Traits添加编译时types信息等数据。
不太了解Ruby,但希望这有些帮助。