Самостоятельное наследование типов в scala - PullRequest
9 голосов
/ 06 августа 2010

Скажем, у меня есть следующие черты:

trait A

trait B { this: A => }

trait C extends B // { this: A => }

Ошибка компилятора: illegal inheritance; self-type C does not conform to B's selftype B with A
Как и ожидалось, если я раскомментирую аннотацию собственного типа, компилятор будет счастлив.

Iдумаю, совершенно очевидно, почему С также нужен этот тип.Что я не понимаю, почему он не может «наследовать» его от A, если компилятор уже может выяснить, что ему нужно?

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

Я думаю,вероятно, есть веская причина для текущего поведения, я просто не мог найти / выяснить, что это такое.

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

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

Или это связано с некоторыми трудностями в правильной реализации этого?

Я мог бы найти некоторые обсуждения по теме (например, self-тип не наследуется ), но в основном они просто излагают проблему и приходят к выводу, что так оно и есть без особых объяснений и / или решения (если оно существует).

1 Ответ

1 голос
/ 06 августа 2010
trait C extends B with A

не единственное решение. Вы также можете иметь

trait AA extends A
trait C extends B with AA

То есть все, что наследует интерфейс A, принимается. Если вы должны полагаться на конкретную реализацию, вы бы выбрали миксин; если реализация зависит от пользователя, или у вас есть веская причина не указывать миксин в признаке (например, чтобы ослабить проблемы с зависимостями), вы должны сделать его типом самостоятельно.

...