差分

2012-03-24 28 views
1

我在C#的以下代碼:差分

1)

public class MyBinaryTree<TItem> where TItem : IComparable<TItem> 
{ ... }; 

2)

public class MyBinaryTree<TItem> : IComparable<TItem> 
{ ... }; 

I found this sample at this site,但它不是完全我想要的方式

第一個示例/代碼告訴我們item(TItem)實現了接口IComparable

第二個示例/代碼告訴我們,我們的整個類(MyBinaryTree)實現了接口IComparable

我不太瞭解它。 我從來沒有用過的第一個例子和我經常使用的第二個例子(這是一個經典的界面示例)。一些建議 - 補充?

它如何實際應用

+1

這裏是否存在真正的代碼問題? – ja72 2012-03-24 18:09:21

回答

5

區別在於第二個例子是接口繼承。第二個是constraints泛型類型可以是什麼。

接口繼承意味着繼承該接口的類必須提供接口中包含的方法的實現(除非是抽象的)。因此,這實質上對課程施加了約束,並且它如何構建。

約束另一方面,對類中使用的泛型類型施加約束。這使得實現能夠對課程中允許做什麼TItem做出某些假設。

例子:

繼承

public class IComparableImplemented : IComparable<T> 
{ 
    //MUST implement CompareTo 
    public int CompareTo(T other) 
    { 
     //Compare stuff 
    } 
} 

類型約束

public class ClassUsingConstraints<T> where T : IComparable<T> 
{ 
    public static void method(T stuff) 
    { 
     stuff.CompareTo(stuff); 
    } 
} 

所以,你會發現,繼承迫使類來實現的方法。儘管類型約束不會強制類實現上的任何內容。相反,類型約束強制T必須執行IComparable。所以,這樣你就可以依靠T訪問CompareTo方法

0

這些陳述並沒有真正的可比性! Pun打算

你說的一個是經典的實現,另一個說是MyBinaryTree集合中的有效條目,成員必須實現該接口。

public class MyBinaryTree<TItem> where TItem : IComparable<TItem> 

可以很容易地被

public class MyBinaryTree<TItem> where TItem : int; 
{ 
} 

這只是選擇在這兩個語句是導致你緊鎖眉頭使用IComparable的。