Наследуя черту дважды
Это не работает:
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
и имеет смысл быть запрещенным.