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

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

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 ответ

Решение

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

Implementation, Trait, Abstraction, ScalaObject, AnyRef, Any

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

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

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

Другие вопросы по тегам