2012-09-28 69 views
0

我有一個名爲Employee的類。現在我試着定義它的Equals方法,但我想只接受Employee作爲參數。爲什麼我必須重寫虛擬方法而不是使用多態?

所以我寫這篇文章的代碼:

class MainClass 
    { 
     public static void Main (string[] args) 
     { 
      Employee e = new Employee(); 
      Employee e2 = new Employee(); 
      Console.WriteLine(Equals(e, e2)); 
     } 

     public static Employee CreateEmployee() 
     { 
      return new Employee(); 
     } 
    } 

    class Employee 
    { 
     public int ID; 
     public bool Equals (Employee e) 
     { 
      Console.WriteLine("Compare!"); 
      return ID == e.ID; 
     } 
    } 

但它不工作!控制檯輸出:

false 

不出我所料:

Compare! 
true 

它看起來像我有寫public override bool Equals (Object),但是爲什麼呢? Can not C#根據參數類型選擇要調用的方法?

回答

4

我有一個名爲Employee類。現在我嘗試定義它的Equals方法,但我只想接受一個Employee作爲參數。

然後你不是壓倒性的,你是超載。這意味着任何想要調用您的代碼或者必須基於參數的執行時間類型動態執行它,它必須提前知道您的過載並考慮到它。

如果你讓Employee實現IEquatable<Employee>(你應該還覆蓋GetHashCode,最好覆蓋Equals(object)的理智),後者是可行的 - 那麼什麼它採用EqualityComparer<T>.Default最終會使用你的方法。這將包括Dictionary<,>

但基本上,任何事情預計到能夠調用Equals(object)將得到繼承的實現,因爲你沒有覆蓋它。 C#在執行時根本不執行重載解析,除非您使用dynamic類型的動態類型 - 這在其他方面具有顯着影響,而不僅僅是性能。

你有兩個選擇,真正做到:

  • 使用具有不同的規則
  • 遵循的C#,其中選擇在編譯時的方法簽名的規則的動態語言,但實施那方法簽名被確定爲執行時間多態
0

你沒有得到你所期望的,因爲你調用不同的Equals滿足)您可以調用對象的方法,它是C#中所有類的父類,但您期望您將調用Employee類的Equals方法。要調用僱員類的等值方法,您應該使用Employee實例:

Employee e1 = new Employee(); 
Employee e2 = new Employee(); 
Console.WriteLine(e1.Equals(e2)); 
相關問題