Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala具有类的多重继承_Scala_Oop - Fatal编程技术网

Scala具有类的多重继承

Scala具有类的多重继承,scala,oop,Scala,Oop,为什么Scala不支持普通类的多重继承?难道我们不能应用同样的线性化逻辑,我们也适用于类的特征吗?这应该是可能的,因为这是通过C3线性化在Python中实现多重继承(使用普通类)的方式。我不知道Python,但在我看来,trait和类之间的区别在于构造函数 与普通方法相比,构造函数有许多限制。例如,每个对象只能调用一次它们,每个新对象都必须调用它们,子类构造函数必须调用其父类的构造函数 A / \

为什么Scala不支持普通类的多重继承?难道我们不能应用同样的线性化逻辑,我们也适用于类的特征吗?这应该是可能的,因为这是通过C3线性化在Python中实现多重继承(使用普通类)的方式。

我不知道Python,但在我看来,trait和类之间的区别在于构造函数

与普通方法相比,构造函数有许多限制。例如,每个对象只能调用一次它们,每个新对象都必须调用它们,子类构造函数必须调用其父类的构造函数

                       A
                     /   \    
                    /     \
                   B       C
                    \     /
                     \   /
                       D
现在,著名的钻石问题。如果B和C继承自A,D继承自B和C,则A的构造函数将被调用两次。与选择traits方法的实现不同,必须调用B和C的构造函数,而这又需要调用A的构造函数


Traits避免了这个问题,因为它们没有构造函数。

Scala根本不需要类。你只需要拥有构造函数,就可以完成它


它有类的唯一原因是为了与底层主机平台兼容。Scala希望运行的大多数平台(Java、.NET、Objective-C/Cocoa、ECMAScript)只支持类(或ECMAScript中的原型)的单一继承。

[Scala Difference]或其他Scala邮件列表中的一个更适合回答这个问题,但简言之,答案类似于“JVM/Java兼容性”.这是一个很好的答案;)Martin Odersky说Scala不需要类。他有一个健全的初始化排序算法的草图和一个该算法正确性证明的草图。类纯粹是为了与底层主机平台兼容。你能举出消息来源吗。如果Martin Odersky说考虑到scala collection库的源代码到处都有类,而Martin是这些文件的作者,那就很奇怪了。@JörgWMittag我参加聚会有点晚了,但我也很好奇:)