为什么Scala不支持普通类的多重继承?我们是否也可以应用相同的线性化逻辑,我们也适用于Traits的类?这应该是可能的,因为它是通过C3线性化在Python中实现多重继承(使用普通类)。
答案 0 :(得分:8)
我不知道Python,但是IMO,特征和类之间的区别是构造函数。
与普通方法相比,构造函数有许多限制。例如,每个对象只能调用一次,必须为每个新对象调用它们,子类构造函数必须调用它的父元素的构造函数。
A
/ \
/ \
B C
\ /
\ /
D
现在,着名的钻石问题。如果B和C继承自A和D继承自B和C,那么A的构造函数将被调用两次。与选择traits方法的实现不同,必须调用B和C的构造函数,而这些构造函数又需要调用A的构造函数。
Traits避免了这个问题,因为它们没有构造函数。
答案 1 :(得分:1)
Scala根本不需要课程。你可以让traits拥有构造函数,并完成它。
它有类的唯一原因是与底层主机平台的兼容性。 Scala希望运行的大多数平台(Java,.NET,Objective-C / Cocoa,ECMAScript)仅支持类的单继承(或ECMAScript中的原型)。