[英]Overloading a method in an immutable class
假設我有一個帶有x
和y
參數的不可變Point
類,以及一個定義如下的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)
我們必須編寫新的定義,因為否則, ColoredPoint
上的add
方法將返回錯誤的Point
。 但是現在這在大多數語言中都行不通,因為我們覆蓋了add
但是只對返回類型進行了歧義。 語言不允許您只對返回類型進行歧義的方法,因為在大多數情況下,這可能是模棱兩可的。
那么我們該怎么辦?
我看到的唯一解決方案是:
IPositionable
還要別的嗎?
如果要強制不變性,則不能有子類。 例如,由於以下原因,請參見java.lang.String
,這是一個final
類:為了防止人們將String子類化以使其可變。
另外,為什么Rect
擴展Point
? 這不是一回事嗎? 從幾何角度看,它們甚至不存在於相同的維中。
最后,我看不到子類的方法問題返回更嚴格的類型(某些語言對此不支持)與不變性之間的聯系。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.