假设我有一个带有Point
和x
参数的不可变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
还有别的吗?
答案 0 :(得分:1)
如果要强制实现不变性,则不能拥有子类。例如,请参见java.lang.String
,这是一个final
类:为了防止人们对String进行子类化以使其可变。
另外,为什么Rect
首先会延伸Point
?这不是一个完全不同的东西吗?几何方面,它们甚至不存在于同一维度。
最后,我看不到子类上的方法问题之间的联系,它返回一个更受限制的类型(以及一些不支持这种语言的语言)和不变性。