2012-04-03 4 views
1

Я хотел бы создать различные классы сортировки (QuickSort, MergeSort, BucketSort ... и т. Д.). У меня есть общий интерфейс (ISort).Как написать общий интерфейс 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 - это символ. Как я могу сохранить этот класс, чтобы я мог использовать этот класс для сортировки int, float, double, char ... и т. Д.?

+1

BTW: если у вас есть QuickSort, зачем вам нужны другие;) – Carsten

ответ

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.

Смежные вопросы