違い

2012-03-24 9 views
1

IはC#で次のコード有する:違い

1)

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

2)

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

I found this sample at this siteを、それが完全ありません方法は私が欲しい。

最初の例/コードは、アイテム(TItem)がインターフェイスIComparableを実装していることを示しています。

2番目の例/コードは、クラス(MyBinaryTree)全体がIComparableインターフェイスを実装していることを示しています。

とてもよく分かりません。 私が一度も使ったことのない最初の例と、よく使う第二の例(これはインターフェイスの古典的な例です)。いくつかのアドバイス - サプリメント?

どうすればが実際に適用されますか

+1

ここに実際のコードの質問がありますか? – ja72

答えて

5

違いは、2番目の例はインターフェイスの継承です。 2番目のタイプは汎用タイプのものである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); 
    } 
} 

だから、あなたは継承がメソッドを実装するクラスを強制することがわかります。一方、型制約はクラスの実装に何も強制しません。その代わりに、タイプの制約は、TIComparableを実装する必要があります。したがって、あなたはTCompareToメソッドにアクセスすることができます。

0

ステートメントは実際には比較できません。 Punが意図している

あなたが言うのは古典的な実装であり、もう1つはMyBinaryTreeコレクションの有効なエントリであると言っています。メンバーはインターフェイスを実装する必要があります。

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

は簡単にそれだけであなたのfurrowed額につながっている両方のステートメントにIComparableをを使用することを選択だ

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

だったかもしれません。