2012-04-03 20 views
1

Ich möchte verschiedene Sortierklassen erstellen (QuickSort, MergeSort, BucketSort ... usw.). Ich habe eine gemeinsame Schnittstelle (ISort).Wie schreibe ich eine generische ISort-Schnittstelle?

Diese Schnittstelle verfügt über eine Methode:

Collection<T> Sort(Collection<T> list); 

Wenn nun im eine Klasse zu verwenden versuchen, scheint, wie ich so zu erklären haben:

ISort<char> sort = new QuickSort(); 

Die QuickSort Implementierung sieht wie folgt aus:

public class QuickSort : ISort<char> 
    { 
     public Collection<char> Sort(Collection<char> list) 
     { 
      // TODO: implement this. 
      return null; 
     } 
    } 

Diese Implementierung ist was ich nicht mag, weil die T-Vorlage ein Zeichen ist. Wie kann ich diese Klasse generisch halten, so dass ich diese Klasse verwenden kann, um ein int, float, double, char usw. zu sortieren?

+1

BTW: Wenn Sie QuickSort haben, warum brauchen Sie die anderen;) – Carsten

Antwort

2

Genau wie folgt aus:

public class QuickSort<T> : ISort<T> 
    { 
     public Collection<T> Sort(Collection<T> list) 
     { 
      // TODO: implement this. 
      return null; 
     } 
    } 

mit

ISort<char> sort = new QuickSort<char>(); 
1

Sortierung hat nichts mit dem Datentyp in der Sammlung zu tun, die sortiert werden, so dass Sie nicht einen Typparameter auf Klassenebene zwingen sollte . Außerdem müssen Sie Objekte vergleichen, damit sie IComparable implementieren können.

Sie könnten die Schnittstelle wie das Design und vermeiden auf die Art binden die Instanz der Sortierklasse wird es sort:

interface ISort 
{ 
    ICollection<T> Sort<T>(ICollection<T> collection) where T : IComparable<T>; 
} 

class QuickSort : ISort 
{ 
    public ICollection<T> Sort<T>(ICollection<T> collection) where T : IComparable<T> 
    { 
     Comparer<T> comparer = Comparer<T>.Default; 
     // TODO: Implement 
     return collection; 
    } 
} 

Dann können Sie das gleiche Sortierobjekt für alle Datentypen verwenden. Der einzige Nachteil dieses Entwurfs besteht darin, dass Sie basierend auf dem generischen Typparameter keinen spezifischen Zustand speichern können. Also QuickSort konnte keine Felder enthalten, die den generischen Typ paremeter T verwenden.

Verwandte Themen