2011-11-07 48 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”可能是什么,但我担心我自己的妻子。 –