0

クラスCOMPARABLEで定義されている関数is_equal()をよりよく理解しようとしています。

オブジェクトoの場合、関数呼び出しo.is_equal(o)falseを返します。

この関数は、 =とは異なり、オブジェクトのアドレスを比較するだけでなく、それらのすべての属性の値も比較することを知っています。

この定義に従うと、同じオブジェクトを比較しているため、そのような呼び出しは常にtrueを返すと確信していました。

誰かが私の考えのどこが間違っているのか説明していただければ幸いです。

4

1 に答える 1

1

現時点では、feature の起源is_equalは classANYであり、 ではありませんCOMPARABLE。クラスは機能を再定義し、不等式に関して (または、より正確にはクエリに関して) 等式のプロパティを指定COMPARABLEする事後条件を追加します。何が起こっているのかを理解するために、起源を見てみましょう。trichotomyis_less

クラスANYには不変条件があります

reflexive_equality: standard_is_equal (Current)

同時に機能is_equalには事後条件があります

consistent: standard_is_equal (other) implies Result

2 つを組み合わせると ( が何であるかを知らなくてもstandard_is_equal)、新しい不変式を導き出すことができます。

new_reflexive_equality: is_equal (Current)

これは、すべてのオブジェクトに対して有効である必要があります。したがって、式が常に同じオブジェクトを生成するとすぐにo(たとえば、呼び出しごとに異なるオブジェクトを返す関数ではなく、変数である場合)、o.is_equal (o) 常に を生成する必要がありTrueます。もちろん、is_equalreturnを再定義しようとすることはできますFalseが、これは機能の契約を破ることになります。

実生活では、比較は通常o1.is_equal (o2)、との値に応じてTrueまたはになります。Falseo1o2

于 2016-08-20T10:44:01.097 に答える