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
?我不想覆盖。
答案 0 :(得分:3)
您可以使用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.apply
将Bar
作为其返回类型,无需重写。
您可以在Twitter Scala school了解有关F-bounded多态性的更多信息。
答案 1 :(得分:0)
浏览了this文章。似乎这就是你想要的。快速查看简单示例(在此示例中使用var
)
class A(var s: String) {
def apply(a: String): this.type = {
s = "A" + a
this
}
}
class B(var s: String) extends A(s)
P.S。:尝试使用val但是在返回类型为this.type
的方法中调用构造函数是不可能的。也许你会找到解决方案))