1

次のコードを使用して Equals をテストしています

public override bool Equals(object obj)
{
    // Equals must return false on compares to null. 
    if (obj == null || GetType() != obj.GetType())
        return false;

    Foo fooItem = obj as Foo;

    return fooItem.FooId == this.FooId;
}

obj がスーパークラスの場合、どのように処理すればよいですか? 常に false を返す必要がありますか、それとも true になる必要がある場合がありますか?

どうやって比較するの?

4

3 に答える 3

3

それは本当にあなたが平等が何を意味したいかに依存します。

異なるクラス間の平等を認めたことはないと思います。ただし、そうなる場合もあります。

カスタムを使用できることも忘れないでくださいIEqualityComparer<T>。これは、他の状況で他のコードがオーバーライドに固執しないことを意味するため、実際には一般的ではない方法で同等性をテストする場合は常に優れた戦略です。Equalsをオーバーライドできるのは、タイプごとに1回だけですが、必要な数の比較子を使用できます。

于 2012-10-21T14:18:07.540 に答える
1

GetType()比較を削除し、objをFooとして最初の行に移動するだけです。

その場合、コードは次のようになります

public override bool Equals(object obj)
{
    var fooItem = obj as Foo;
    // Equals must return false on compares to null. 
    if (obj == null) {
        return false;
    }

    return fooItem.FooId == this.FooId;
}

Equalsこれは、一度派生したすべてのFooに対して意味のある完全な値の比較があること、または上記のオーバーライドを実装するクラスが封印されていることを前提としています。

すべてのFoos(一度派生したものを含む)に対して意味のある値の比較がない場合は、代わりにIEqualityComaprerを使用することをお勧めします。他のすべてのインスタンスメソッドと同様に、それらが単なる補助メソッドではなく、本当に型の一部である場合にのみ、クラス階層に含める必要があります。

于 2012-10-21T14:19:01.837 に答える
0

さまざまなタイプのオブジェクトが互いに同等であると報告することが役立つシナリオがいくつかあるかもしれませんが、そのような使用はしないことを強くお勧めします。おそらく正当化できると私が見ることができるのは、Equalsさまざまな仮想メソッドを使用する封印されたメソッドを含む共通の基本クラスから継承されたすべての型が、オブジェクトがサポートする迅速な等値比較の手段をオブジェクトに尋ね、利用可能な最良のものを使用する場合です。メソッドを使用し、迅速なメソッドが利用できない場合は、オブジェクトを正規の形式に変換して比較します。

たとえばImmutableFloatingPointMatrix、2 つの引数のインデックス付きプロパティ ゲッターを実装する抽象型を考えてみましょう。2 つの行列は、サイズが同じで、同じ場所に同じ値がある場合、等しいと見なされます。派生クラスが 2 次元配列を使用して行列の内容を保持することは可能ですが、他の多くの格納方法も可能です。たとえばIdentityMatrix、単一のSizeフィールドを持ち、その次元を常にSizexとして報告Sizeし、主対角線上のセルに対して 1.0 を返し、それ以外の場所では 0.0 を返すインデックス付きプロパティを持つ具象クラスがあるとします。DiagonalMatrix単一のを使用する を持つこともできますSize-アイテムを対角線上に保持するための配列。対応するすべての要素をチェックすることにより、任意の 2 つの行列が等しいかどうかを比較できますが、たとえば aDiagonalMatrixと an の照合IdentitymMatrixは、2 つの行列が同じサイズであること、および配列内のすべての項目が 1.0 であることを確認することにより、より適切に処理できます (気にする必要はありません)。主対角線の外側にスポットがないことを確認してください)。

Equals異なる型のオブジェクトが自分自身を同等であると報告するようにセマンティクスを適切に定義できる型であっても、それは最良のアイデアではない可能性があります。カスタムを使用できる場合はEqualityComparer、奇妙なオーバーライドよりもおそらく優れているでしょうEquals

于 2012-12-03T22:56:58.293 に答える