重载不可变类中的方法

时间:2012-06-25 03:34:00

标签: oop inheritance immutability

假设我有一个带有Pointx参数的不可变y类,以及一个add方法定义如下:

class Point:
  Point add(int x, int y):
    return new Point(this.x + x, this.y + y);

因为它是不可变的,所以它返回一个新的Point。在我们有一个扩展Point的类并重新定义add之前,这一切都很好。

class ColoredPoint extends Point:
  ColoredPoint add(int x, int y):
    return new ColoredPoint(this.x + x, this.y + y, this.width, this.height)

我们必须编写新定义,否则add上的ColoredPoint方法会返回Point,这是不好的。但是现在这在大多数语言中都不起作用,因为我们要覆盖add,但我们只是在返回类型上消除歧义。语言不允许您使用仅在返回类型上消除歧义的方法,因为在大多数情况下这可能是不明确的。

那我们该怎么做?

我看到的唯一解决方案是:

  • 让他们都实现一些界面,如IPositionable
  • 放弃不变性。

还有别的吗?

1 个答案:

答案 0 :(得分:1)

如果要强制实现不变性,则不能拥有子类。例如,请参见java.lang.String,这是一个final类:为了防止人们对String进行子类化以使其可变。

另外,为什么Rect首先会延伸Point?这不是一个完全不同的东西吗?几何方面,它们甚至不存在于同一维度。

最后,我看不到子类上的方法问题之间的联系,它返回一个更受限制的类型(以及一些不支持这种语言的语言)和不变性。