gpt4 book ai didi

scala - 堆叠特征中 super 的含义取决于调用站点?

转载 作者:行者123 更新时间:2023-12-01 04:57:18 28 4
gpt4 key购买 nike

我无法用语言很好地描述这一点,所以,请看一下这个例子:

trait Base { def foo = "Base" }
trait One extends Base { override def foo = "One <: " + super.foo }
trait Two extends Base { override def foo = "Two <: " + super.foo }

new Base with One with Two {} foo

这打印: Two <: One <: Base ,这是我所期望的。
现在,我正在尝试添加另一个级别,以便覆盖特征不必调用 super明确地。像这样:
trait Base { def foo = "Base" }
trait Foo extends Base { def bar = foo + " <: " + super.foo }
trait One extends Foo { override def foo = "One" }
trait Two extends Foo { override def foo = "Two" }

new Foo with One with Two {} bar

在这里,最后一行打印出 Two <: Base
所以,它看起来像第一个示例 super表示 One , 而在最后一个它跳过 One并直接转至 Base .

为什么会这样?行为不应该是一样的吗?

最佳答案

在第一种情况下,new Base with One with Two {} foo (与 new One with Two {} foo 相同),“特征堆栈”非常明显。 Two有一个 foo调用 foo它的 super ( One )调用 foo它的 super (Base)。

在第二种情况下,new Foo with One with Two {} bar (与 new One with Two {} bar 相同),“特征堆栈”是 Base->Foo->One->Two。您调用bar但是 Two没有barOne没有bar . Foo有一个 bar调用 foo它的 super (Base)。

更新

正如@Dima 所提议的那样考虑这个mod。

trait Base { def foo = "Base" }
trait Foo extends Base { def bar = foo + " <: " + super.foo }
trait One extends Foo { override def bar = super.bar
override def foo = "One" }
trait Two extends Foo { override def bar = super.bar
override def foo = "Two" }

new One with Two {} bar // no Base or Foo needed

是的,这给出了与以前相同的输出: res0: String = Two <: Base
现在 Two调用 bar它的 super ( One )调用 bar它的 super ( Foo )调用 foo (不是 bar )它的 super 。

这一切 bar事件独立于 foo定义。 Two从不调用 foo它的 super 所以 One.foo从未使用过,也不能成为输出的一部分。

不同的方法

考虑以下。
trait B { def id = "B" } // B for Base

trait V extends B { override def id = "V" }
trait W extends B { override def id = "W" }
trait X extends B { override def id = "X" }
trait Y extends B { override def id = "Y" }
trait Z extends B { override def id = "Z" }

trait R extends B { override def id = "R"; def mySup = super.id } // Required

现在尝试以多种不同的方式实例化它。
val r = new V with Y with W with R with X {} // B not needed
// or
val r = new W with R with Z with X with V {}
// or
val r = new R with Y with V with B with W {}
// or
val r = new Z with Y with X with W with R {}
// etc.

在每种情况下 r.id将是链中的最后一个特征, r.mySup将是 R 之前的特征(或 B 如果在 R 之前没有指定任何内容)。

关于scala - 堆叠特征中 super 的含义取决于调用站点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36182817/

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