gpt4 book ai didi

scala - `super` 是否静态绑定(bind)在类中?

转载 作者:行者123 更新时间:2023-12-01 09:05:50 26 4
gpt4 key购买 nike

我正在阅读 Martin Odersky 等人(第 2 版)在“Scala 编程”中关于特征的章节,我对 super 在静态绑定(bind)类中的声明感到困惑,与特征不同,动态绑定(bind)的位置(第 220 页)。

我理解这句话,但是当涉及到像这样的例子时:

val queue = (new BasicIntQueue with Incrementing with Filtering)

p.229 或线性化的完整解释(p.234)在我看来,super 不能静态绑定(bind),因为否则堆叠特征是不可能的 - 即当类“开始”已经解析了 super 的堆栈方法调用链,无论用户将什么添加到特征堆栈,它都会命中直接类父类。

我错过了什么? :-) super 真的静态绑定(bind)到它的父级吗?

最佳答案

val queue = (new BasicIntQueue with Incrementing with Filtering)

on p.229 or entire explanation of linearization (p.234) it seems to me, that super cannot be statically bound, because otherwise stacking traits would not be possible -- i.e. when class "starts" the chain of calling of stacked method with super already resolved, it would hit direct class parent no matter what user added to the stack of traits

但在这种情况下,链不是从 BasicIntQueue 的方法开始,而是从 Filtering 的方法开始。如果没有混合特征覆盖方法,它只会从类开始。如果您改为定义

class MyQueue extends BasicIntQueue with Incrementing with Filtering {
.. // some super calls
}

// an anonymous class
val queue = new BasicIntQueue with Incrementing with Filtering {
.. // some super calls
}

super 将引用 BasicIntQueue with Incrementing with Filtering,这是静态解析的。

但是,Incrementing 中的 super 调用是动态解析的:在 BasicIntQueue with Incrementing 中,它们将引用 BasicIntQueue ,而在 BasicIntQueue with Filtering with Incrementing 中,它们将引用 BasicIntQueue with FilteringIncrementing 没有任何变化。

关于scala - `super` 是否静态绑定(bind)在类中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30342048/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com