类/抽象类不支持多重继承,但scala中的特性支持多重继承。为什么?

时间:2016-12-09 23:21:12

标签: scala

让我解释一下我在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
}

我的问题是为什么类的多重继承不遵循特征所做的相同策略(订购如何扩展)

1 个答案:

答案 0 :(得分:1)

每个Scala类都编译为单个JVM类,而JVM不支持类的多重继承。