C# 重写Equals和GetHashCode-派生类中的默认实现
我对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
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
来调用基本实现。这是规定的问题2:“你还打你妻子吗?”{对,错,不适用} 他们真的一样吗
操作符==
和操作符=代码>以防止令人不快的意外
QuestionTrueFalse
来调用基本实现。这是规定的问题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();}
?