Переопределение Equals и GetHashCode - реализация по умолчанию в производном классе - PullRequest
1 голос
/ 08 ноября 2011

Меня немного смущает поведение по умолчанию Equals и GetHashCode в C #. Скажем, у меня есть два класса, один из которых происходит от другого:

public abstract class Question
    {
        public string QuestionText
        {
            get;
            set;
        }

        public override bool Equals(object obj)
        {
            if (obj is Question)
            {
                Question q = (Question)obj;
                return this.QuestionText.Equals(q.QuestionText);
            }
            else
            {
                return false;
            }
        }

        public override int GetHashCode()
        {
            int hash = 13; 
            hash = (hash * 7) + this.QuestionText.GetHashCode(); 
            return hash; 
        }
 }

public class QuestionTrueFalse : Question
    {
        public bool CorrectAnswer
        {
            get;
            set;
        }

        public override bool Equals(object obj)
        {
            return base.Equals(q);
        }

        public override int GetHashCode()
        {
            return base.GetHashCode(); 
        }
    } 

Производный класс не влияет на то, равен ли один элемент другому, я все же хочу, чтобы он основывался просто на свойстве QuestionText.

Нужно ли переопределять Equals и GetHashCode для ссылки на базовую реализацию, как я это сделал здесь, или это поведение по умолчанию?

Ответы [ 3 ]

6 голосов
/ 08 ноября 2011

Поведение базового класса наследуется наследующими классами. Вам не нужно явно переопределять Equals и GetHashCode, если вы не хотите изменить их поведение.

4 голосов
/ 08 ноября 2011
  1. Вы, вероятно, не хотите этого.Почему вы хотите иметь отдельные, но равные экземпляры объекта вопроса?

  2. По крайней мере, вам придется добавить operator== и operator!=, чтобы предотвратить неприятные сюрпризы.

  3. Но нет, вам не нужно переопределять в QuestionTrueFalse для вызова базовой реализации.Это предусмотрено.

Стандартный пример (не могу придумать более ПК):

Q1: "Ты все еще избиваешь свою жену?"{true, false}
Q2: "Ты все еще избиваешь свою жену?"{true, false, N / A}

Они действительно одинаковы?

0 голосов
/ 18 июля 2013

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

Вы можете обратиться к этой статье для более глубокого анализа того, как изменяется назначение методов Equals и GetHashCode после получения класса: Как переопределить методы Equals и GetHashCode в базовых и производных классах

...