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

2023-12-27

我无法用语言对此进行很好的描述,所以,请看这个例子:

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 means One,而在最后一个它会跳过One并直接转到Base.

为什么会发生这种情况?行为不应该是一样的吗?


在第一种情况下,new Base with One with Two {} foo(这与new One with Two {} foo),“特质堆栈”非常明显。这Two has a foo这称为foo其超级(One)这称为foo其超级(Base).

在第二种情况下,new Foo with One with Two {} bar(这与new One with Two {} bar),“特征堆栈”是 Base->Foo->One->Two。你打电话bar but Two has no bar and One has no bar. Foo has a bar这称为foo其超级(Base).

UPDATE

考虑一下 @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

Now Two称为bar其超级(One)这称为bar其超级(Foo)这称为foo (not bar)其超级。

所有这些bar活动与foo定义。Two从不调用foo其超级所以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 (or B如果之前没有指定任何内容R).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

堆叠特征中 super 的含义取决于调用站点? 的相关文章

随机推荐

  • Twitter Bootstrap 微调器 .btn

    我正在尝试为 Twitter Bootstrap 按钮创建微调器 Spinner 应该指出一些正在进行的工作 即 ajax 请求 这是一个小例子 http jsfiddle net AndrewDryga zcX4h 1 http jsfi
  • “Where”语句:匹配单个单词(不是子字符串)

    我正在使用MySQL 我有一个car我的数据库中有一个表name该表中的列 假设name表的列包含值 name AAA BB CC D BB OO kk BB PP B CC 我想搜索表在哪里name列值包含单词 BB 不是子字符串 实现此
  • 使用网络浏览器下载 Rust 包

    有没有办法使用网络浏览器下载 Rust 依赖项 我目前可以通过网络浏览器访问互联网 但无法通过命令提示符 Windows 访问互联网 我知道我可以设置本地文件服务器并且设置 Cargo 使用镜像 https gmjosack github
  • 如何使我的本地存储库可用于 git-pull?

    我有一个工作副本存储库 我一直在使用它 没有任何问题 该存储库的来源位于 GitHub 上 我想让我的工作副本存储库作为我的构建机器 另一个物理主机上的虚拟机 的来源 以便我对工作副本所做的提交可以在构建机器上构建和测试 而无需通过首先是
  • C++ 模板运算符编译错误

    我正在尝试创建一个类似的 C 类std ostream 这将获取其输入并写入两个std ostreams 在构造函数中给出 这里它与适当的operator lt lt 模板 struct SplitStream SplitStream st
  • 哈德逊“聚合下游测试结果”的问题

    我的 Hudson 项目似乎没有正确聚合下游测试结果 我想知道我是否错过了某个地方的配置步骤 我有两个项目 Foo 和 Foo Tests 这两个项目都是自由式作业 在项目 Foo 上我有以下配置 选中 聚合下游测试结果 在上一个选项下选中
  • Winsock 仅在程序关闭时发送数据

    我有一个 C Windows 程序 它通过 WM COPYDATA 消息从另一个 C 程序接收数据 然后应该使用 Sockets winsock 将此消息发送到用 Java 编写的服务器 客户端与服务器的连接正常 但似乎无法及时发送消息 然
  • 出现错误:建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误

    我是新手开发者 我在尝试从我的计算机连接到 SQL Server 到服务器计算机时遇到问题 建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误 服务器未找到或无法访问 验证实例名称是否正确以及 SQL Server 是否
  • Highcharts 上下文菜单按钮在同一图表中出现三次

    I am creating a highcharts But when the chart finishes loading i can see 3 buttons for context menu and only one of them
  • 我如何了解我的库是什么标准以及 gcc 在我的计算机中编译的标准是什么?

    这是来自我的终端 Korays MacBook Pro koraytugay gcc version Configured with prefix Library Developer CommandLineTools usr with gx
  • 为什么 (0 < a < 5) 这样的条件总是成立?

    我用C实现了以下程序 include
  • 使用 Selenium 测试 Angularjs 应用程序

    我正在测试 Angular js 应用程序 Link Angular js 应用程序 http iarouse com demo index html product square 当我单击 Web 应用程序上的 UI Kit 链接时 出现
  • Interface Builder 中的 PNG 透明度

    我在 Interface Builder 中添加一个带有透明 PNG 导航栏中的徽标 的图像视图 但透明像素似乎呈现为白色 我在 Interface Builder 中搜索了 PNG 但没有成功 有小费吗 确保视图属性的 绘图 部分中的 不
  • Git 日志:致命对象 [sha1] 已损坏

    有什么方法可以修复我的存储库并保持提交历史记录完好无损 git log fatal object 01aeb2bf2e93b238f0e0422816b3e55518321ae7 is corrupted 从阅读下面的链接来看 我似乎要删除
  • Asp.net Mvc3 webgrid 和分页

    我正在尝试学习Asp net mvc 我知道它与形式不同 我可能需要改变我的思维方式 我的问题是关于 webgrid 的 当我将 webgrid 添加到我的页面并使用 Post 按下搜索按钮时 它会使用寻呼机等呈现表格 但是寻呼机上的链接不
  • Linux 内核中 IRQ 和中断向量之间的区别

    当涉及到内核 API 的工作时 我对 IRQ 和向量有点困惑 我想使用向量 0xfa 进行一些由可编程 lapic 生成的中断处理 我查看了 API 例如request irq and set intr gate also alloc in
  • 结合 Git Bash 并在 CMDER 中的当前文件夹中打开

    请描述我 谁有这样的经验 如何正确设置CMDER的选项以在当前文件夹中使用Git Bash打开新控制台 例如在此处打开CMDER 该字符串不起作用 C Program Files x86 Git bin sh exe login i new
  • 使用来自存储 C#.Net CNG 的密钥进行 ECDSA 签名文件

    我正在尝试使用 CNG API 和 Microsoft 证书存储中的证书通过 ECDSA 签署文件 我已经阅读了大量文档并且即将完成 但我对从证书导入私钥感到困惑 我已经用 RSA 做了同样的事情 但它的做法似乎非常不同 这是我到目前为止的
  • bash 中的 for 循环只是打印 n 次命令而不是重复

    我有一个包含 6000 多行的 input txt 文件 如果一行 a 包含超过 10 个单词 那么我希望将其拆分 但不是在第 10 个单词处 而是在第一个逗号字符出现的位置处 并且 如果新行也有超过10个单词 那么它也应该被拆分 并不断重
  • 堆叠特征中 super 的含义取决于调用站点?

    我无法用语言对此进行很好的描述 所以 请看这个例子 trait Base def foo Base trait One extends Base override def foo One lt super foo trait Two ext