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が、リターンタイプについてのみ明確にしています。言語では、ほとんどの場合あいまいになる可能性があるため、returntypeでのみ明確化されるメソッドを使用することはできません。

どうしようか?

私が見る唯一の解決策は次のとおりです。

  • 両方に次のようなインターフェースを実装させますIPositionable
  • 不変性をあきらめます。

他に何か?

4

1 に答える 1

1

不変性を強制したい場合は、サブクラスを持つことはできません。たとえばjava.lang.Stringfinalこの理由でクラスであるを参照してください。人々が文字列をサブクラス化して可変にすることを防ぐため。

また、そもそもなぜRect拡張するのでしょうか。Pointまったく違うことではないですか?幾何学的には、それらは同じ次元にさえ存在しません。

最後に、より制限された型を返すサブクラスのメソッドの問題(およびこれを適切にサポートしていない一部の言語)と不変性との関係を理解できません。

于 2012-06-25T03:55:17.153 に答える