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