我对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来引用基本实现,就像我在这里所做的那样,还是默认行为?
答案 0 :(得分:6)
继承类继承基类行为。除非您想更改他们的行为,否则您无需明确覆盖Equals
和GetHashCode
。
答案 1 :(得分:4)
你可能不想要这个。为什么你想要一个问题对象的单独但相等的实例?
您至少需要添加operator==
和operator!=
来防止令人讨厌的惊喜。
但不,您不需要在QuestionTrueFalse
中覆盖以调用基本实现。这是提供的。
标准示例(无法提供更多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