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

Lai*_*uan 8 oop scala traits

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

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

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

Rex*_*err 8

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

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

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