2012-04-03 21 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的字段。