繁体   English   中英

Scala:多态菊花链

[英]Scala: Polymorphic daisy chaining

class Foo(protected[this] val s: Iterator[String]) {
  def apply(it: Iterator[String]): Foo = new Foo(it ++ s)
}

class Bar(s: Iterator[String]) extends Foo(s) {

}

问题:如何让Bar.apply()返回一个new Bar而不是一个new Foo 我不想覆盖。

您可以使用F-bounded多态来获取返回正确类型的apply 您还需要定义一个创建子类实例的方法:

abstract class Foo[X](protected[this] val s: Iterator[String]) {
  self: X =>
  def newSubclass(s: Iterator[String]): X
  def apply(it: Iterator[String]): X = newSubclass(it ++ s)
}

class Bar(s: Iterator[String]) extends Foo[Bar](s) {
  def newSubclass(s: Iterator[String]): Bar = new Bar(s)
}

Bar.applyBar作为其返回类型,无需重写。

您可以在Twitter Scala学校阅读有关F-bounded多态的更多信息。

仔细阅读了这篇文章。 似乎这就是你想要的。 快速查看简单示例(在此示例中使用var

class A(var s: String) {
  def apply(a: String): this.type = {
    s = "A" + a
    this
  }
}

class B(var s: String) extends A(s)

PS:尝试使用val但是在返回类型为this.type方法中调用构造函数是this.type 也许你会找到解决方案))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM