2011-11-07 66 views
1

我對C#中的Equals和GetHashCode的默認行爲有點困惑。 說我有兩個班,從另外一個推導:覆蓋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

你爲什麼不只是寫'公共覆蓋INT的GetHashCode(){返回91 +本.QuestionText.GetHashCode(); }'? – phoog

回答

6

基類行爲由繼承類繼承。除非你想改變他們的行爲,你不需要明確地覆蓋EqualsGetHashCode

+0

完美答案。我只是想補充說,重寫一個方法來調用基類型的版本對程序的行爲沒有任何影響(除非你使用反射)。 –

4
  1. 你可能不想要這個。爲什麼你想要有一個問題對象的獨立但平等的實例?

  2. 您至少不得不添加operator==operator!=以防止令人不快的驚喜。

  3. 但是,不需要在QuestionTrueFalse中覆蓋調用基本實現。這是規定的。

標準例(不能拿出更多的PC之一):

Q1: 「你還打你的妻子」 {true,false}
Q2:「你還打敗你的妻子嗎?」 {true,false,N/A}

他們真的是一樣嗎?

+2

我很想知道「N/A」可能是什麼,但我擔心我自己的妻子。 –

相關問題