2012-03-24 12 views
1

Ich habe den folgenden Code in C#:Unterschied zwischen Interface Vererbung und generischen Einschränkungen

1)

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

2)

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

I found this sample at this site, aber es ist nicht ganz Der Weg ich will.

Das erste Beispiel/Code sagt uns, dass Element (TItem) implementiert die Schnittstelle IComparable.

Das zweite Beispiel/Code sagt uns, dass unsere ganze Klasse (MyBinaryTree) die Schnittstelle IComparable implementiert.

Ich verstehe es nicht sehr gut. Das erste Beispiel, das ich noch nie benutzt habe und das zweite, das ich oft benutze (dies ist ein klassisches Beispiel für das Interface). Einige Ratschläge - Ergänzungen?

Wie funktioniert es in der Praxis ?

+1

Gibt es hier eine echte Code Frage? – ja72

Antwort

5

Der Unterschied ist, dass das zweite Beispiel Schnittstellenvererbung ist. Die zweite ist constraints auf was der generische Typ sein kann.

Schnittstellenvererbung bedeutet, dass die Klasse, die diese Schnittstelle erbt, Implementierungen (sofern sie nicht abstrakt sind) der in der Schnittstelle enthaltenen Methoden bereitstellen muss. Dies bedeutet im Wesentlichen Einschränkungen für die Klasse und wie sie aufgebaut wird

Einschränkungen auf der anderen Seite auferlegen Einschränkungen für den generischen Typ, der innerhalb der Klasse verwendet wird. Dies ermöglicht der Implementierung, bestimmte Annahmen darüber treffen zu können, was TItem in der Klasse tun darf.

Beispiele:

Inheritance

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

Typ Constraints

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

Also, werden Sie feststellen, dass Erbe der Klasse zwingt ein Verfahren zu implementieren. Typ-Constraints erzwingen nichts an der Klassenimplementierung. Stattdessen Typ Zwangsbedingungen zwingen, dass TIComparable implementieren müssen. Also, auf diese Weise können Sie sich auf T Zugriff auf die CompareTo Methode

0

verlassen, die Aussagen sind nicht wirklich vergleichbar! Pun beabsichtigt

Eins, wie Sie sagen, ist eine klassische Implementierung, der andere sagt, um ein gültiger Eintrag in der Sammlung MyBinaryTree zu sein, muss das Mitglied die Schnittstelle implementieren.

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

leicht

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

Es ist nur könnte die Wahl IComparable in beiden Aussagen zu verwenden, die auf Ihre gerunzelte Stirn führen.

Verwandte Themen