2012-04-03 40 views
1

我想創建各種排序類(QuickSort,MergeSort,BucketSort等)。 我有一個共同的接口(ISort)。如何編寫通用的ISort接口?

這個接口有一個方法:

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

現在,當我嘗試使用它似乎是一個類像我要聲明的是這樣的:

ISort<char> sort = new QuickSort(); 

快速排序的實現看起來是這樣的:

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

這個實現是我不喜歡的,因爲T模板是一個字符。 我該如何保持這個類的通用,以便我可以使用這個類來排序int,float,double,char ...等?

+1

順便說一句:如果你有QuickSort,爲什麼你需要其他的;) – Carsten 2012-04-03 05:38:55

回答

2

就像這樣:

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

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

排序無關與集合中的數據類型進行排序,所以你不應該在類級別強制類型參數。你也需要比較對象,以便它們實現IComparable。

你可以設計這樣的界面和防止佔壓排序類的實例的類型它將排序:

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; 
    } 
} 

然後你就可以使用相同的排序對象爲所有的數據類型。這種設計的一個缺點是,您將無法根據泛型類型參數存儲特定的狀態。因此,QuickSort不能包含使用通用類型參數表T的字段。