假设我有一个带有和参数的不可变Point
类,以及一个这样定义的方法:x
y
add
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)
我们必须编写新的定义,否则add
on 方法ColoredPoint
会返回Point
,这是不好的。但是现在这在大多数语言中都不起作用,因为我们正在覆盖add
,但我们只是在返回类型上消除歧义。语言不允许您拥有仅在返回类型上消除歧义的方法,因为在大多数情况下这可能是模棱两可的。
那么我们该怎么办?
我看到的唯一解决方案是:
- 让他们都实现一些接口,比如
IPositionable
- 放弃不变性。
还要别的吗?