3

私はクラスを持っています:

public abstract class AbstractDictionaryObject
    {
        public virtual int LangId { get; set; }

        public override bool Equals(object obj)
        {
            if (obj == null || obj.GetType() != GetType())
            {
                return false;
            }

            AbstractDictionaryObject other = (AbstractDictionaryObject)obj;
            if (other.LangId != LangId)
            {
                return false;
            }

            return true;
        }

        public override int GetHashCode()
        {
            int hashCode = 0;               
            hashCode = 19 * hashCode + LangId.GetHashCode();
            return hashCode;
        }

そして、私は派生クラスを持っています:

public class Derived1:AbstractDictionaryObject
{...}

public class Derived2:AbstractDictionaryObject
{...}

には、AbstractDictionaryObject共通フィールドが 1 つだけありますLangId
メソッドを(適切に)オーバーロードするには、これでは不十分だと思います。
どうすればオブジェクトを識別できますか?

4

1 に答える 1

7

1 つには、両方の方法を単純化できます。

 public override bool Equals(object obj)
 {
     if (obj == null || obj.GetType() != GetType())
     {
         return false;
     }

     AbstractDictionaryObject other = (AbstractDictionaryObject)obj;
     return other.LangId == LangId;
 }

 public override int GetHashCode()
 {
     return LangId;
 }

しかし、その時点でそれはうまくいくはずです。2 つの派生クラスに他のフィールドがある場合は、最初に独自のロジックを呼び出すか、次に適用して、それらをオーバーライドする必要がGetHashCodeあります。Equalsbase.Equalsbase.GetHashCode

Derived1with the sameの 2 つのインスタンスは、関係LangIdする限り同等AbstractDictionaryObjectであり、- の 2 つのインスタンスも同様ですDerived2が、タイプが異なるため、互いに異なります。

それらに異なるハッシュ コードを与えたい場合は、次のように変更できGetHashCode()ます。

 public override int GetHashCode()
 {
     int hash = 17;
     hash = hash * 31 + GetType().GetHashCode();
     hash = hash * 31 + LangId;
     return hash;
 }

ただし、異なるオブジェクトのハッシュ コードが異なる必要はありません...それはパフォーマンスに役立つだけです。同じ. _ _LangId

于 2011-08-10T05:31:48.413 に答える