1

Java、.NETファミリ、Python、Rubyなどの多くのオブジェクト指向言語では、他のすべてのクラスが継承するルートオブジェクトクラスが等価性チェックメソッドを定義していると確信しています。ただし、私の経験では、私が作成するクラスの多くは、実際には同等性チェックを必要としないか、私(または同僚)がデフォルトのメソッドを使用するつもりがないため、それをオーバーライドする必要はありません。後者の場合、デフォルトの等式メソッドは、そのクラスの等式をうまく表現していません。では、多くのクラスがそうすべきではないと思われるのに、なぜこれほど多くの言語がルートオブジェクトクラスの定義の一部としてこのメ​​ソッドを提供するのでしょうか。等式法を省略して、必要なときにユーザーに定義を強制してみませんか?

4

1 に答える 1

1

オブジェクトの参照Xと、タイプに関係なく、「オブジェクトは、によって参照されるオブジェクトと同等にY参照されますか」という質問に意味のある質問と回答を行うことができます。ポルシェ911の自動車を表し、鋳鉄製の公園のベンチを表す場合、答えは単に「いいえ」になります。確かに、それが車とベンチであることがわかっていれば、わざわざ質問することはないでしょうが、、、、またはその両方が「ペイントを求められる可能性のあるもの」であると考えてください。かどうかわからないかもしれませんXYXYXYXYXY同じタイプであり、オブジェクトは同等ではないので、気にしないかもしれません。同等性を求める普遍的な手段を持つことで、コードはオブジェクトの正確なタイプについて心配する必要がなくなります。

すべてのオブジェクトEqualsを仮想メソッドとして実装する理由は、オブジェクトが参照の同等性よりも広い同等性の定義を提供できる最も簡単なメカニズムだからです。多くの場合、不変オブジェクトが同じ不変状態を持つ他のオブジェクトと同等であると報告するのが便利です[たとえば、2つの文字列があり、両方とも6文字の「GEORGE」を保持し、互いに同等であると報告します]すべてのオブジェクトをEquals仮想メソッドとして実装します、および可変オブジェクトの実装で参照の同等性を報告するだけの場合、一般にEquals、不変オブジェクトでのみ使用できる関数を使用するよりも簡単です。結局のところ、可変オブジェクトがそれ自体をそれ自体以外のものと等しくないと単に報告することは難しくありません。

于 2013-01-18T20:32:23.940 に答える