2012-05-03 54 views
1

在C#深入中,Jon Skeet使用IEquatable<> 覆蓋 過載Equals()操作。實現接口如何爲我們提供強類型化的API?

public sealed class Pair<T1, T2> : IEquatable<Pair<T1, T2>> 
{ 
    public bool Equals(Pair<T1, T2> other) 
    { 
     //... 
    } 
} 

他說,我們這樣做是「給一個強類型的API,它會避免不必要的執行時間檢查」。

哪些執行時間檢查被避免?更重要的是,如何實現一個接口來實現強類型化的API?

我可能錯過了本書的內容。我認爲接口讓我們通過多態來重用代碼。我也明白,它們很適合用抽象而不是具體的類型進行編程。這就是我所知道的。

+2

它不*重寫*等於 - 重載*等於。 –

回答

5

默認Equals methodobject作爲參數。因此,實施這種方法時,你必須讓你的代碼運行時檢查以確保這個對象是Pair型的(之前你可以比較這兩種):

public override bool Equals(Object obj) { 
    // runtime type check here 
    var otherPair = obj as Pair<T1, T2>; 
    if (otherPair == null) 
     return false; 

    // comparison code here 
    ... 
} 

IEquatable<T>Equals方法,但是,將Pair<T1,T2>作爲類型參數。因此,你能避免在實施檢查,使之更爲高效:

public bool Equals(Pair<T1, T2> other)  
{  
    // comparison code here 
    ... 
}  

類,如Dictionary<TKey, TValue>List<T>LinkedList<T>有足夠的智慧使用IEquatable<T>.Equals而不是object.Equals對它們的元素,如果有的話(見MSDN )。

+0

,所以不需要非泛型IEquatable接口在Jon的書中定期提到通過使用泛型來改進API。我相信這就是他所說的API部分的意思,通過實現* generic *接口強大的打字與對象強制轉換。 –

0

我認爲喬恩說「強類型」談到泛型。

我還沒有找到非通用的IEquitable接口,但IComparable<T>IComparable存在。

+2

鑑於'object'已經具有'Equals(object)' –

2

IEquatable<T>接口提供了一個強類型實現Equals方法,相對於在所述System.Object方法Equals接收一個System.Object

3

在這種情況下,他提供的Object.Equals一個強類型版本將取代代碼可能如下所示是:

public override bool Equals(object other) 
{ 
    // The following type check is not needed with IEquatable<Pair<T1, T2>> 
    Pair<T1, T2> pair = other as Pair<T1, T2>; 
    if (pair != null) 
    { 
     // <-- IEquatable<Pair<T1, T2>> implementation 
    } 
    else 
    { 
     return base.Equals(other); 
    } 
} 
0

爲了公平對待飛碟雙向(雖然肯定他將沿着很快)他做花時間討論第2.2.1節中「強類型」的含義。

在您的問題(我的版本第85頁))的上下文中,我認爲他意味着默認的Equals方法(將對象作爲參數)遵循實現接口的強類型Equals方法。

相關問題