让我解释一下我在scala中关于多重继承的观察 -
类的scala中无法进行多重继承。我可以理解这是由于“钻石问题”http://stackoverflow.com/questions/2064880/diamond-problem
因此下面的代码无法编译
class High {
def confuse(){
println("High::I will confuse you later")
}
}
class MiddleLeft extends High {
override def confuse(){
println("MiddleLeft::I will confuse you later")
}
}
class MiddleRight extends High{
override def confuse(){
println("MiddleRight::I will confuse you later")
}
}
// Below code does not compile
class LowLeft extends MiddleRight with MiddleLeft{
def calConfuse(){
confuse()
}
}
现在特质可能有具体的类。但它支持多重继承,因为如何扩展特征的顺序对解决钻石问题很重要,所以下面的代码工作正常
trait High {
def confuse(){
println("High::I will confuse you later")
}
}
trait MiddleLeft extends High {
override def confuse(){
println("MiddleLeft::I will confuse you later")
}
}
trait MiddleRight extends High{
override def confuse(){
println("MiddleRight::I will confuse you later")
}
}
class LowLeft extends MiddleRight with MiddleLeft{
def calConfuse(){
confuse()
}
}
class LowRight extends MiddleLeft with MiddleRight{
def calConfuse(){
confuse()
}
}
object ConfuseTester extends App{
val lowLeft:LowLeft=new LowLeft()
lowLeft.confuse() //prints>>>MiddleLeft::I will confuse you later
val lowRight:LowRight=new LowRight()
lowRight.confuse()//prints>>>MiddleRight::I will confuse you later
}
我的问题是为什么类的多重继承不遵循特征所做的相同策略(订购如何扩展)
答案 0 :(得分:1)
每个Scala类都编译为单个JVM类,而JVM不支持类的多重继承。