Составление независимых черт - PullRequest
8 голосов
/ 05 мая 2010

Имеются две независимые черты:

trait T1 {
    def x = 42
}

trait T2 {
    def x = 0
}

Если я попытаюсь определить класс смешивания в этих двух чертах, таких как:

class C extends T1 with T2

Я получаю ошибку компилятора:

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

Теперь предположим, что T1 и T2 были разработаны независимо, следовательно, нет переопределения, поскольку они ничего не перекрывают. Как можно определить C тогда? Как это:

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

1 Ответ

10 голосов
/ 05 мая 2010

Это известно как проблема алмазов . В 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
}

Если вы сейчас позвоните new C().x, вы получите 42, потому что Scala использует реализацию черты, которую вы смешали в последнюю очередь. Кстати, new D().x даст 0. Это означает, что для решения алмазной проблемы вы должны четко определить, какую реализацию вы хотели бы использовать.

Другой способ заключается в следующем:

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

Вызов new C().x все равно даст 42, потому что T2 - последняя смешанная черта. Разница в том, что вам не нужно определять x в C.

...