首页 文章

重写Equals和GetHashCode - 派生类中的默认实现

提问于
浏览
1

我对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
    • 你可能不想要这个 . 为什么你想要一个问题对象的单独但相等的实例?

    • 您至少必须添加 operator==operator!= 以防止令人讨厌的惊喜 .

    • 但不,你不需要在 QuestionTrueFalse 中覆盖来调用基础实现 . 这是提供的 .

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

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

    它们真的一样吗?

  • 6

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

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

  • 4

    基类行为由继承类继承 . 除非您想要更改其行为,否则无需显式覆盖 EqualsGetHashCode .

相关问题