我看到过很多人在可以使用对象组合的情况下使用(或滥用)mixins,并且我并不总是确定哪个更好。在我看来,您可以通过它们实现相似的事情,但也存在一些差异,例如:
可见性-使用mixins时,所有内容都成为公共API的一部分,而这在组合中并非如此。
冗长-在大多数情况下,mixins较少冗长且使用起来更容易,但并非始终如此(例如,如果您还在复杂的层次结构中使用自身类型)
我知道简短的答案是“取决于”,但可能有一些典型的情况,其中这个或那个更好。以下是我目前能想到的一些指南示例(假设我有两个traits A和B,A想要使用来自B的某些方法):
- 如果您想使用B中的方法来扩展A的API,则使用mixins,否则使用组合。但是,如果我创建的类/实例不是公共API的一部分,则无济于事。
- 如果您想使用需要mixins的某些模式(例如Stackable Trait Pattern),那么这是一个简单的决定。
- 如果存在循环依赖关系,则mixins与自我类型可以帮助解决问题。(我尽量避免这种情况,但并不总是容易)
- 如果您想要一些动态的运行时决策如何进行组合,则使用对象组合。
在许多情况下,mixins似乎更容易(和/或更简洁),但我非常确定它们也有一些缺陷,例如“上帝类”和其他在两篇artima文章中描述的问题:part 1,part 2(顺便说一句,对于Scala来说,大多数其他问题似乎与之不相关/不太严重)。
您有更多类似的提示吗?
this => Logging
这个结构的意思是什么?它无法编译。 - HRJ