【问题标题】:Self type inheritance in scalascala中的自类型继承
【发布时间】:2010-08-06 07:16:15
【问题描述】:

假设我有以下特征:

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
正如预期的那样,如果我取消注释 self 类型注释,编译器会很高兴。

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

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

我想目前的行为可能有充分的理由,我只是找不到/弄清楚它是什么。

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

在某些情况下会导致歧义吗?如果是这样,为什么在没有歧义的情况下它不能工作?

还是与正确实施的一些困难有关?

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

【问题讨论】:

    标签: inheritance scala mixins self-type


    【解决方案1】:
    trait C extends B with A
    

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

    trait AA extends A
    trait C extends B with AA
    

    即接受所有继承A接口的东西。如果你必须依赖具体的实现,你会选择 mixin;如果实现由用户决定,或者您有充分的理由不在 trait 中指定 mixin(例如为了放松依赖问题),您可以将其设为 self-type。

    【讨论】:

    • 我想我很清楚混合特征或使其成为自我类型之间的区别。我的问题是:假设我想要以前的带有 self 类型和混合的特征,并且编译器可以确定我需要(至少)A 作为 C 的 self 类型,为什么它不能自动“添加”它?
    • 我认为这在很多情况下都是不可取的,因为它会在没有给你机会专门化课程的情况下进行编译。当A 在当前范围内不可用时该怎么办?我相信这会令人困惑,应该明确继承和混合。此外,当您想节省输入时,您可以定义一个 trait CA extends C with A 并使用它。
    • Debilski,你误解了这个问题。 OP希望“trait C extends B”等同于“trait C extends B {this: A => }”,而不是“trait C extends B with A”。
    猜你喜欢
    • 1970-01-01
    • 2014-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多