簡體   English   中英

覆蓋Equals和GetHashCode-派生類中的默認實現

[英]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來引用基本實現,或者這是默認行為嗎?

基類的行為由繼承的類繼承。 除非要更改其行為,否則無需顯式覆蓋EqualsGetHashCode

  1. 您可能不想要這個。 您為什么要擁有一個問題對象的單獨但相等的實例?

  2. 您至少必須添加operator==operator!=才能防止令人討厭的意外發生。

  3. 但是,不,您不需要在QuestionTrueFalse重寫即可調用基本實現。 這是規定的。

標准示例(無法提供更多PC):

問題1:“您還打敗妻子嗎?” { 真假 }
問題2:“您還打敗妻子嗎?” {正確,錯誤,不適用}

他們真的一樣嗎?

從關心Equals和GetHashCode的類派生一個類並不是那么簡單。 僅讓基類完成任務就可以忽略許多注意事項。

您可以參考本文進行更深入的分析,一旦派生該類,Equals和GetHashCode方法的用途將如何改變: 如何在基類和派生類中重寫Equals和GetHashCode方法

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM