2011-11-07 11 views
1

C#でのEqualsとGetHashCodeのデフォルトの動作について少し混乱します。 は、私は二つのクラス、他から1つの導出持って言う:派生クラスが一つの項目が他に等しいかどうかには影響しません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でオーバーライドする必要はありません。それはのために提供されます。

    Q1:

標準の例では、(より多くのPC 1を考え出すことはできません) "?あなたはまだあなたの妻を破っています" {true、false}
Q2: "あなたはまだあなたの妻を殴っていますか?" {true、false、N/A}

本当に同じですか?

+2

"N/A"はどういうことかと思っていますが、私は自分の妻を恐れています。 –

0

EqualsとGetHashCodeを気にするクラスから派生したクラスはそれほど単純ではありません。基本クラスに仕事をさせるだけで、多くの考慮事項が省略されています。

はあなたに等しいとGetHashCodeメソッドの方法の変更の目的は、クラスが派生されると、どのように、より深い分析のために、この記事を参照することができますHow to Override Equals and GetHashCode Methods in Base and Derived Classes

関連する問題