覆盖Equals和GetHashCode - 派生类中的默认实现

时间:2011-11-07 22:13:59

标签: c# inheritance equals gethashcode

我对C#中Equals和GetHashCode的默认行为感到有些困惑。 假设我有两个类,一个来自另一个类:

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 个答案:

答案 0 :(得分:6)

继承类继承基类行为。除非您想更改他们的行为,否则您无需明确覆盖EqualsGetHashCode

答案 1 :(得分:4)

  1. 你可能不想要这个。为什么你想要一个问题对象的单独但相等的实例?

  2. 您至少需要添加operator==operator!=来防止令人讨厌的惊喜。

  3. 但不,您不需要在QuestionTrueFalse中覆盖以调用基本实现。这是提供的。

  4. 标准示例(无法提供更多PC):

      第一季:“你还打败你的妻子吗?” {true,false}
      Q2:“你还打败你的妻子吗?” {true,false,N / A}

    它们真的一样吗?

答案 2 :(得分:0)

从一个关注Equals和GetHashCode的类派生的类并不那么简单。仅让基类完成工作就省略了许多注意事项。

您可以参考本文深入分析一旦派生类后,Equals和GetHashCode方法的目的如何变化:How to Override Equals and GetHashCode Methods in Base and Derived Classes