在 Scala 中调用超类构造函数的正确方法是什么?

发布于 2024-10-03 13:31:51 字数 896 浏览 4 评论 0原文

假设我想扩展类 C,获得 SubC

现在我想访问 SubC 中的变量 c,如下面方法 printC 中的示例所示。

以下内容不起作用,因为在 SubC 实例上调用 printC 将打印 SubCc 而不是 < code>C 的 c (我想我可以选择更好的名字......)

class C(protected var c : Int) {
  def update(n : Int) {
    c = n
  }
}

class SubC(c: Int) extends C(c) {
  def printC : Unit = {
    println(c)
  }
}

object Main {
  def main(args: Array[String]) {
    val subC = new SubC(1)
    subC.update(3)
    subC.printC // prints 1
  }
}

一个可能的(但不受欢迎的)解决方案是:

class SubC(cc: Int) extends C(cc) {
  def printC = {
    println(c)
  }
}

这有效,但它引入了一个新的(并且不需要的) ) 标识符 cc 进入范围。

有没有更好(更干净)的方法来做到这一点?

PS:将上面的例子放在一定的上下文中。我真正想做的是用一些特征来增强C,而不在作用域中引入新的标识符。

Suppose I would like to extend class C, getting SubC.

Now I would like to access the variable c in SubC as presented in the example below in the method printC.

The following does not work, as calling printC on a SubC instance will print SubC's c and not C's c (I guess I could have picked better names...)

class C(protected var c : Int) {
  def update(n : Int) {
    c = n
  }
}

class SubC(c: Int) extends C(c) {
  def printC : Unit = {
    println(c)
  }
}

object Main {
  def main(args: Array[String]) {
    val subC = new SubC(1)
    subC.update(3)
    subC.printC // prints 1
  }
}

A possible (but undesirable) solution would be:

class SubC(cc: Int) extends C(cc) {
  def printC = {
    println(c)
  }
}

This works but it introduces a new (and unneeded) identifier cc into scope.

Is there a better (cleaner) way of doing this?

PS: To put the example above into some context. What I actually want to do is to augment C with some traits without introducing new identifiers into scope.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

傲鸠 2024-10-10 13:31:51

这可能是在不引入新标识符的情况下用特征增强 C 的最佳方法:

class C(protected var c : Int) {
  def update(n : Int) {
    c = n
  }
}

trait CanPrintC {
  self: C =>
  def printC : Unit = {
      println(c)
  }
}
class SubC(c: Int) extends C(c) with CanPrintC 

object Main {
  def main(args: Array[String]) {
    val subC = new SubC(1)
    subC.update(3)
    subC.printC // prints 3
  }
}

This is probably the best way to augment C with traits without introducing new identifiers in scope:

class C(protected var c : Int) {
  def update(n : Int) {
    c = n
  }
}

trait CanPrintC {
  self: C =>
  def printC : Unit = {
      println(c)
  }
}
class SubC(c: Int) extends C(c) with CanPrintC 

object Main {
  def main(args: Array[String]) {
    val subC = new SubC(1)
    subC.update(3)
    subC.printC // prints 3
  }
}
廻憶裏菂餘溫 2024-10-10 13:31:51

使用自我类型:

class SubC(c: Int) extends C(c) {  
  self: C =>
  def printC : Unit = {            
    println(self.c)              
  }
}

Use self types:

class SubC(c: Int) extends C(c) {  
  self: C =>
  def printC : Unit = {            
    println(self.c)              
  }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文