首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类/抽象类不支持多重继承,但scala .Why中的特征支持多重继承?

类/抽象类不支持多重继承,但scala .Why中的特征支持多重继承?
EN

Stack Overflow用户
提问于 2016-12-10 07:21:12
回答 1查看 223关注 0票数 0

让我解释一下我在scala中对多重继承的观察:

在类的scala中,多重继承是不可能的。我可以理解这是由于“钻石问题”的http://stackoverflow.com/questions/2064880/diamond-problem,所以下面的代码不能编译

代码语言:javascript
复制
    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()
  }
}

现在,特征可能有了具体的类。但它支持多重继承,因为特征如何扩展的顺序关系到解决菱形问题的顺序,因此下面的代码可以正常工作

代码语言:javascript
复制
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
}

我的问题是,为什么类的多重继承不像特征那样遵循相同的策略(如何扩展的顺序)

EN

回答 1

Stack Overflow用户

发布于 2016-12-10 13:18:54

每个Scala类都被编译成一个JVM类,并且JVM不支持类的多重继承。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41070383

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档