假设,我们有一个带有类的不可变库ImmutableFoo
:
scala> class ImmutableFoo(x: Int) {
def add(y: Int): ImmutableFoo = new ImmutableFoo(x + y)
}
defined class ImmutableFoo
当然,这个类的一个对象不会通过添加y
to 来改变它的状态x
,而是创建一个新的类对象。到目前为止,一切都很好。
现在我们要创建一个不可变的子类。第一次尝试:
scala> class subImmutableFoo(x: Int) extends ImmutableFoo(x)
defined class subImmutableFoo
但是当我们添加一个数字时,我们没有得到子类的对象:
scala> (new subImmutableFoo(5)).add(6)
res0: ImmutableFoo = ImmutableFoo@1ee69d3
解决此问题的最佳实践方法是什么?
一种解决方案可能是覆盖子类中的方法并创建子类的对象。在这种情况下,这个解决方案很简单,但是当方法更大时,可能会导致大量的双重代码(基类 + 子类)。当我们创建多个子类并覆盖该方法时,甚至更多的代码是重复的。