1

假设我有一个带有和参数的不可变Point类,以及一个这样定义的方法:xyadd

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

由于它是不可变的,因此它返回一个新点。这一切都很好,直到我们有一个扩展 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)

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

那么我们该怎么办?

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

  • 让他们都实现一些接口,比如IPositionable
  • 放弃不变性。

还要别的吗?

4

1 回答 1

1

如果要强制执行不变性,则不能有子类。例如java.lang.String,这是一个final类,原因如下:防止人们继承 String 以使其可变。

另外,为什么会首先Rect扩展Point?这不是完全不同的事情吗?在几何方面,它们甚至不存在于同一维度中。

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

于 2012-06-25T03:55:17.153 回答