我想创建各种排序类(QuickSort,MergeSort,BucketSort等)。 我有一个通用的接口(ISort)。
此界面有一个方法:
Collection<T> Sort(Collection<T> list);
现在,当我试图使用一个类时,似乎我必须这样声明:
ISort<char> sort = new QuickSort();
QuickSort实现如下所示:
public class QuickSort : ISort<char>
{
public Collection<char> Sort(Collection<char> list)
{
// TODO: implement this.
return null;
}
}
这个实现是我不喜欢的,因为T模板是一个char。 我如何保持这个类通用,以便我可以使用这个类来对int,float,double,char等进行排序?
答案 0 :(得分: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 :(得分: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的字段。