![](/img/trans.png)
[英]static Object.Equals method, default implementation of GetHashCode and the Dictionary class
[英]Overriding Equals and GetHashCode - default implementation in derived class
我對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
。
您可能不想要這個。 您為什么要擁有一個問題對象的單獨但相等的實例?
您至少必須添加operator==
和operator!=
才能防止令人討厭的意外發生。
但是,不,您不需要在QuestionTrueFalse
重寫即可調用基本實現。 這是規定的。
標准示例(無法提供更多PC):
問題1:“您還打敗妻子嗎?” { 真假 }
問題2:“您還打敗妻子嗎?” {正確,錯誤,不適用}
他們真的一樣嗎?
從關心Equals和GetHashCode的類派生一個類並不是那么簡單。 僅讓基類完成任務就可以忽略許多注意事項。
您可以參考本文進行更深入的分析,一旦派生該類,Equals和GetHashCode方法的用途將如何改變: 如何在基類和派生類中重寫Equals和GetHashCode方法
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.