Scala - наследство второго поколения общей черты - PullRequest
2 голосов
/ 22 февраля 2012

Если у меня есть следующий код в Scala:

trait A {
  var yo = 10
  def get = yo
}

trait B extends A { /* makes use of A.get */ }
trait C extends A { /* makes use of A.get */ }

trait D extends B with C { /* makes use of A.get */ }

class E extends D { /* makes use of A.get */ }

Как компилятор разрешит зависимости?Другими словами, поймет ли он, что относящаяся к A-черте часть черты D и объекта E, унаследованная от двух разных черт B и C, должна рассматриваться как одна вещь, а не дублироваться для каждого случая наследования?В любом случае, как будут выглядеть мысли компилятора в этой ситуации?

Ответы [ 2 ]

5 голосов
/ 22 февраля 2012

Из этой главы по программированию в Scala, как предлагает tenhi, у нас есть следующий пример:

class Animal 
trait Furry extends Animal
trait HasLegs extends Animal
trait FourLegged extends HasLegs
class Cat extends Animal with Furry with FourLegged

, который выводится в следующий конвейер:

Cat -> FourLegged -> HasLegs -> Furry -> Animal 

Таким образом, тот, кто справа, имеет приоритет, но его предки, если они не являются общими предками других на конвейере, также имеют приоритет.Вот почему HasLegs предшествует Furry.

Наконец, вот ответ для вашего конкретного примера:

E -> D -> C -> B -> A 
5 голосов
/ 22 февраля 2012

Я считаю, что эта глава Программирование в Scala может помочь вам в понимании процесса линеаризации черт:

Программирование в Scala - 12.6 Почему не множественное наследование?

...