scala中的自我类型继承

时间:2010-08-06 07:16:15

标签: inheritance scala mixins self-type

说我有以下特征:

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
如果我取消注释自我类型注释,编译器很高兴。

我认为很明显为什么C也需要这种自我类型。我不明白为什么它不能从A“继承”它,如果编译器已经知道它需要它?

我认为当你使用具有复杂层次结构的自我类型时,它可以减少冗长,特别是如果你混合了很多特征,每个特征都有自己的自我类型。

我想可能有一个很好的理由当前的行为,我只是找不到/弄清楚它是什么。

起初我认为它可能与mixin线性化有关,但在我看来它并没有在这里发挥(即使我有更多的特征与更复杂的自我类型混合)。

在某些情况下会引起歧义吗?如果是这样,为什么在没有歧义时它不能起作用?

或者它与正确实施它的一些困难有关?

我可以找到关于这个主题的一些讨论(比如self type is not inherited),但是他们大多只是陈述问题并得出结论,如果没有太多的解释和/或解决方案(如果它存在),它是如何的。

1 个答案:

答案 0 :(得分:1)

trait C extends B with A

不是唯一的解决方案。你也可以

trait AA extends A
trait C extends B with AA

即,接受继承A接口的所有内容。如果你必须依赖具体的实现,你会选择mixin;如果实现取决于用户,或者您有充分的理由不在特征中指定mixin(例如,为了放松依赖性问题),那么您将使其成为自我类型。