在Java世界中(更确切地说,如果您没有多个继承/混合),经验法则非常简单:“在类继承上是最喜欢的对象组成”。
我想知道是否/如果您也考虑混入,特别是在scala中,如何更改混入?
是否将mixin视为一种多重继承或更多类组合的方式?
还有“从对象组成到从类组成”(或相反)的指导原则吗?
当人们使用(或滥用)mixins进行对象组合也可以完成工作时,我已经看到了很多示例,但我并不总是确定哪一个更好。在我看来,您可以通过它们实现非常相似的事情,但是也存在一些差异,例如:
- 可见性-使用mixins时,所有内容都成为公共api的一部分,对于组合而言,情况并非如此。
- 冗长-在大多数情况下,mixin不太冗长,使用起来也更容易一些,但并非总是如此(例如,如果您还在复杂的层次结构中使用自身类型)
我知道简短的答案是“取决于情况”,但是当这种情况更好时,可能会有一些典型情况。
到目前为止,我可以提出一些准则示例(假设我具有A和B的两个特征,A希望使用B的某些方法):
- 如果要使用B的方法扩展A的API,则使用混合包,否则使用组合。但是,如果我正在创建的类/实例不属于公共API的一部分,则无济于事。
- 如果您想使用一些需要混合的模式(例如Stackable Trait Pattern),那么这是一个简单的决定。
- 如果您有循环依赖项,那么使用self类型的mixin可以提供帮助。(我试图避免这种情况,但这并不总是那么容易)
- 如果您需要一些动态的,运行时的决定,然后决定如何进行合成,然后进行对象合成。
在许多情况下,mixin似乎更容易(和/或不太冗长),但是我敢肯定,它们也存在一些陷阱,例如“上帝类”以及其他两篇artima文章中所述的其他内容:第1部分,第2部分(顺便说一句在我看来,其他大多数问题与scala无关/并不那么严重。
您还有更多类似的提示吗?
this => Logging
什么?它不会编译。