在 Java 世界中(更准确地说,如果您没有多重继承/混合),经验法则非常简单:“优先考虑对象组合而不是类继承”。
我想知道如果您还考虑mixins,它是否/如何改变,尤其是在scala中?
mixins 是否被认为是一种多重继承或更多类组合的方式?
是否还有“优先对象组合优于类组合”(或相反)指南?
当对象组合也可以完成这项工作时,我看到了很多例子,当人们使用(或滥用)mixin 时,我并不总是确定哪个更好。在我看来,你可以用它们实现非常相似的东西,但也有一些区别,一些例子:
- 可见性 - 使用 mixins,一切都成为公共 api 的一部分,而组合则不是这样。
- 冗长 - 在大多数情况下,mixin 不那么冗长并且更易于使用,但并非总是如此(例如,如果您还在复杂的层次结构中使用 self 类型)
我知道简短的回答是“视情况而定”,但可能有一些典型的情况是这样或那样更好。
到目前为止我可以提出的一些指导方针示例(假设我有两个特征 A 和 B,并且 A 想要使用 B 中的一些方法):
- 如果你想用 B 中的方法扩展 A 的 API,那么 mixins,否则组合。但是,如果我正在创建的类/实例不是公共 API 的一部分,它也无济于事。
- 如果您想使用一些需要混合的模式(例如Stackable Trait Pattern),那么这是一个简单的决定。
- 如果你有循环依赖,那么带有 self 类型的 mixin 会有所帮助。(我尽量避免这种情况,但这并不总是那么容易)
- 如果您想要一些动态的运行时决定如何进行组合,然后是对象组合。
在许多情况下,mixin 似乎更容易(和/或不那么冗长),但我很确定它们也有一些陷阱,比如“上帝类”和两篇 artima 文章中描述的其他内容:第 1部分,第 2 部分(顺便说一句在我看来,大多数其他问题与 scala 无关/不那么严重)。
你有更多这样的提示吗?