Scala mixin真的比多个C ++继承更好吗?

时间:2013-06-01 13:45:28

标签: oop scala traits

人们说C ++继承是邪恶的,所以Java用接口修复了这个问题。

但是Scala介绍了trait,它们是......部分实现的接口?这不会带来多重继承吗?

这是否意味着Scala家伙认为多重继承是好的?或者他们有一些我没注意到的关键差异?

1 个答案:

答案 0 :(得分:8)

多重继承的最糟糕部分是钻石继承,其中子类在链的某个地方有两条或更多条到同一父类的路径。如果实现沿两条路径不同(即从原始实现中被覆盖),则会产生歧义。在C ++中,解决方案特别难看:您嵌入了两个不兼容的父类,并且必须指定何时调用所需的实现。这是令人困惑的,在每个调用站点创建额外的工作(或者,更有可能,迫使您明确覆盖并说出您想要的那个;这个手动工作很繁琐并且引入错误的机会),并且可能导致对象大于他们应该是。

Scala通过将多重继承限制为特征来解决一些但不是所有问题。因为traits没有构造函数,所以最终的类可以线性化继承树,也就是说,即使两个父母在路径上回到共同的超级父母名义上都是父母,一个是“纠正“一个,即最后列出的一个。如果你可以拥有(完全通用的)构造函数,那么这个方案会留下破坏的半初始化类,但实际上,你不必将类嵌入两次,并且在使用站点你可以忽略多少继承(如果有的话)发生了。但是,如果你将许多特征叠加在一起,并且如果你继承了BC,你就不会更容易推理会发生什么。选择一些B实现和一些C的。

因此它更好地解决了对C ++模型的一些最严重的批评。它是否更好是一个品味问题;很多人甚至喜欢C ++的多重继承的味道,足以使用它。