Scala中下面的继承代码有什么问题?

kmpatx3s  于 5个月前  发布在  Scala
关注(0)|答案(1)|浏览(50)

下面的代码片段有什么问题,这与钻石问题有关吗?当我试图用D的示例调用函数func时,我面临运行时错误

trait B{
  def func(): Unit = {
    println("Inside class B")
  }
}

trait C{
  def func(): Unit = {
    println("Inside class C")
  }
}

class D extends B with C{
}

object ABC extends App{
  val ob = new D
  ob.func()
}

字符串

fae0ux8s

fae0ux8s1#

好吧,正如所写的那样,B.funcC.func是 * 不相关的 *,所以当你执行D extends B with C时,它最终会有两个同名的不相关成员-这就是错误。
解决这个问题的一个天真的尝试是添加一个共同的父节点:

trait A { def func(): Unit }
trait B extends A { def func() = println("B") }
trait C extends A { def func() = println("C") }

class D extends B with C

字符串
令人惊讶的是,这也不能编译(在我看来这是编译器中的一个bug),但是如果你只是在声明中添加override(这不是必需的,* 应该 * 不会有任何区别),* 那么 * 它会:🤷

trait A { def func(): Unit }
trait B extends A { override def func() = println("B") }
trait C extends A { override def func() = println("C") }

class D extends B with C

更新好吧,也许,我需要放松一下我对“编译器中的bug”的咆哮,并将其降级为“模糊和怪异的行为”:)在这种情况下,似乎只有C中的声明需要overrideB可以没有. D中的Cfunc覆盖了具体的实现(来自B),这使得override是必需的.如果编译器错误实际上提到了这一点,我愿意更进一步,把“晦涩和怪异的行为”降级为“不必要的样板要求”:)

相关问题