我对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 回答
你可能不想要这个 . 为什么你想要一个问题对象的单独但相等的实例?
您至少必须添加
operator==
和operator!=
以防止令人讨厌的惊喜 .但不,你不需要在
QuestionTrueFalse
中覆盖来调用基础实现 . 这是提供的 .标准示例(无法提供更多的PC):
它们真的一样吗?
从一个关注Equals和GetHashCode的类派生的类并不那么简单 . 仅让基类完成工作就省略了许多注意事项 .
您可以参考本文以更深入地分析在派生类后,Equals和GetHashCode方法的目的如何变化:How to Override Equals and GetHashCode Methods in Base and Derived Classes
基类行为由继承类继承 . 除非您想要更改其行为,否则无需显式覆盖
Equals
和GetHashCode
.