簡體   English   中英

重載不可變類中的方法

[英]Overloading a method in an immutable class

假設我有一個帶有xy參數的不可變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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM