构成独立的特征

45g*_*45g 8 scala traits

鉴于两个独立的特征:

trait T1 {
    def x = 42
}

trait T2 {
    def x = 0
}
Run Code Online (Sandbox Code Playgroud)

如果我尝试定义一个混合在这两个特征中的类,如:

class C extends T1 with T2
Run Code Online (Sandbox Code Playgroud)

我收到编译器错误:

error: overriding method x in trait T1 of type => Int;
method x in trait T2 of type => Int needs `override' modifier
class C extends T1 with T2
      ^
one error found
Run Code Online (Sandbox Code Playgroud)

现在假设T1和T2是独立开发的,因此没有覆盖,因为它们不会覆盖任何东西.那么如何定义C?像这样:

class C extends T1 with T2 {
    override def x = super.x
}
Run Code Online (Sandbox Code Playgroud)

Mic*_*mer 10

这被称为钻石问题.在Scala中有两种方法可以解决这个问题:

trait T1 {
  def x = 0
}

trait T2 {
  def x = 42
}

class C extends T1 with T2 {
  override def x = super.x
}

class D extends T2 with T1 {
  override def x = super.x
}
Run Code Online (Sandbox Code Playgroud)

如果你new C().x现在打电话,你会得到,42因为Scala使用你最后混合的特性的实现.new D().x0顺便屈服.这意味着,为了解决钻石问题,您必须明确定义要使用的实现.

另一种方式如下:

trait T {
  def x: Int
}

trait T1 extends T {
  override def x = 0
}

trait T2 extends T {
  override def x = 42
}

class C extends T1 with T2
Run Code Online (Sandbox Code Playgroud)

的调用new C().x仍然会产生42,因为T2是最后的性状的混合.不同的是,你没有定义xC.