Наследуя черту дважды - PullRequest
       28

Наследуя черту дважды

17 голосов
/ 29 августа 2011

Это не работает:

trait Trait
class Class extends Trait with Trait

Компилятор жалуется:

<console>:8: error: trait Trait is inherited twice
       class Class extends Trait with Trait
                           ^
<console>:8: error: trait Trait is inherited twice
       class Class extends Trait with Trait
                                      ^

Это делает:

trait Trait
class Abstraction extends Trait
class Implementation extends Abstraction with Trait

Вопросы:

  • Почему это работает?
  • Чем отличается второй фрагмент?(относительно вопроса двойного наследования)
  • Второй фрагмент или шаблон как-то полезен?

1 Ответ

20 голосов
/ 29 августа 2011

Второй фрагмент работает из-за черты линеаризации.Компилятор организует черты в линейный список так, что Trait появляется только один раз.Я думаю, что линеаризация

Implementation, Trait, Abstraction, ScalaObject, AnyRef, Any

См. эту главу от программирования Scala для хорошего объяснения.

Это прежде всего сделано, чтобы иметь последовательный подход к наследованию алмазовпроблема и полезна в этом случае.

Поскольку Trait не может появиться дважды после линеаризации, нет смысла писать Trait with Trait, и имеет смысл быть запрещенным.

...