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
?我不想重写。斯卡拉:多形菊花链
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限制多态性来获取返回正确类型的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界多态性的信息。
我还以为F-bound也想不出如何引用构造函数。在新的子类上的荣誉,我正在寻找Mjolnir来破解坚果。 – flavian
已浏览this文章。看来这是你想要的。迅速scetch出简单的例子(在此实例中使用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:尝试使用瓦尔斯但它是impposible调用在方法构造,其返回类型是this.type
。也许你会找到解决方案))
不,'this.type'不会做你想做的。 'this.type'不是指'this'所属的类,而是一种方法来说明一个方法返回'this'。 'this.type'的唯一值是'this'。它主要用于结合路径相关类型的流畅API。 – wingedsubmariner
为什么不重写? – maks
我简化了这个例子,还有更多的方法需要以相同的方式和很多扩展类来执行。 – flavian
为什么不提取'新Foo'在单独的方法,然后覆盖它(而不是覆盖'申请')?例如'protected def create(s:Iterator [String]):Foo = new Foo(s)'。你也可以使用反射(但它可能是你不想做的事情,不是吗?) – tenshi