Переопределить Equals и GetHashCode в классе одним полем - PullRequest
2 голосов
/ 10 августа 2011

У меня есть класс:

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 есть только одно общее поле: LangId.
Я думаю, что этого недостаточно для перегрузки методов (правильно).
Как я могу идентифицировать объекты?

1 Ответ

6 голосов
/ 10 августа 2011

С одной стороны, вы можете упростить оба ваших метода:

 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;
 }

Но в этот момент все должно быть хорошо. Если у двух производных классов есть другие поля, они должны сами переопределить GetHashCode и Equals, сначала вызвав base.Equals или base.GetHashCode, а затем применив собственную логику.

Два экземпляра Derived1 с одним и тем же LangId будут эквивалентны в отношении AbstractDictionaryObject, равно как и два экземпляра Derived2 - но они будут отличаться друг от друга, поскольку имеют разные типы. .

Если вы хотите дать им разные хеш-коды, вы можете изменить GetHashCode() на:

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

Однако хэш-коды для разных объектов не имеют , чтобы быть разными ... это просто помогает в производительности. Вы можете сделать это, если знаете, что у будут экземпляры разных типов с одинаковым LangId, но в противном случае я бы не стал беспокоиться.

...