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

C# 重写Equals和GetHashCode-派生类中的默认实现,c#,inheritance,equals,gethashcode,C#,Inheritance,Equals,Gethashcode,我对C#中Equals和GetHashCode的默认行为有点困惑。 假设我有两个类,一个派生自另一个: public abstract class Question { public string QuestionText { get; set; } public override bool Equals(object obj) { i

我对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来引用基实现,就像我在这里所做的那样,还是这是默认行为?

基类行为由继承类继承。除非要更改它们的行为,否则不需要显式重写
Equals
GetHashCode

基类行为由继承类继承。除非要更改它们的行为,否则不需要显式重写
Equals
GetHashCode

  • 你可能不想要这个。为什么您希望问题对象有单独但相等的实例

  • 您至少需要添加
    操作符==
    操作符=以防止令人不快的意外

  • 但是,不需要重写
    QuestionTrueFalse
    来调用基本实现。这是规定的

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

    Q1:“你还打你妻子吗?”{对,错}
    问题2:“你还打你妻子吗?”{对,错,不适用}

    他们真的一样吗

  • 你可能不想要这个。为什么您希望问题对象有单独但相等的实例

  • 您至少需要添加
    操作符==
    操作符=以防止令人不快的意外

  • 但是,不需要重写
    QuestionTrueFalse
    来调用基本实现。这是规定的

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

    Q1:“你还打你妻子吗?”{对,错}
    问题2:“你还打你妻子吗?”{对,错,不适用}


    它们真的是一样的吗?

    从关心Equals和GetHashCode的类派生一个类并不是那么简单。仅仅让基类来完成这项工作就忽略了许多考虑因素


    您可以参考本文来更深入地分析Equals和GetHashCode方法的用途在类派生后如何变化:

    从关心Equals和GetHashCode的类派生类并不是那么简单。仅仅让基类来完成这项工作就忽略了许多考虑因素


    您可以参考本文来更深入地分析Equals和GetHashCode方法在派生类后的用途如何变化:

    Perfect answer。我只是想补充一点,重写一个方法来调用基类型的版本对程序的行为没有任何影响(除非您使用的是反射)。我只是想补充一点,重写一个方法来调用基类型的版本对程序的行为没有任何影响(除非使用反射)。为什么不直接编写
    public override int GetHashCode(){return 91+this.QuestionText.GetHashCode();}
    ?为什么不直接编写
    public override int GetHashCode()){return 91+this.QuestionText.GetHashCode();}