Scala:我如何使我的不可变类更容易子类化?
我最近创建了一个不可改变的类,支持类似的操作,等等,它在更改时返回该类的新实例.
我想要创建该类的子类来添加一些状态和功能,但现在我遇到一个问题,即所有原始类的方法都返回自身的实例而不是子类. 根据我目前对Scala的有限知识,我可以想出这一点: class Foo(val bar:Int) { def copy(newBar:Int) = new Foo(newBar) def + (other:Foo):This = copy(this.bar + other.bar) } class Subclass(barbar:Int) extends Foo(barbar) { override def copy(newBar:Int) = new Subclass(newBar) override def + (other:Subclass) = super.+(other).asInstanceOf[Subclass] } 这里的问题是相当明显的 – 返回新实例的超类的所有操作都必须在具有转换的子类中重新定义. 起初“this.type”似乎有希望,但是“this.type”只包含“this”,而不是任何其他相同类型的对象. 有没有一个标准的模式,使不可变类易于子类化?就像是: class Foo(val bar:Int) { def copy(newBar:Int):SameType = new Foo(newBar) def + (other:Foo) = copy(this.bar + other.bar) } class Subclass(barbar:Int) extends Foo(barbar) { override def copy(newBar:Int):SameType = new Subclass(newBar) override def + (other:Subclass) = super.+(other).asInstanceOf[Subclass] } 这个特定的方法将需要编译器要求所有的子类实现一个copy()方法,该方法返回与该子类相同的类型,这对我来说完全正确.但是,我现在不认为Scala有这样的事情. 一些想到的工作是: >使用委托 – 但是当然我仍然会将所有的方法重新实现为委托调用 我相信这已经很多次了,我再次道歉.我没有成功地重复了Google,所以我的搜索字词一直很差. 提前致谢, Dobes 解决方法
您可以使用实现特征,如集合类做的,由具体类型参数化.例如:
trait FooLike[+A] { protected def bar: Int protected def copy(newBar: Int): A def +(other: Foo): A = copy(bar + other.bar) } class Foo(val bar: Int) extends FooLike[Foo] { protected def copy(newBar: Int): Foo = new Foo(newBar) } class Subclass(barbar: Int) extends Foo(barbar) with FooLike[Subclass] { protected def copy(newBar: Int): Subclass = new Subclass(newBar) } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |