Как написать общий интерфейс ISort? - PullRequest
1 голос
/ 03 апреля 2012

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

Ответы [ 2 ]

2 голосов
/ 03 апреля 2012

Так же, как это:

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 голос
/ 03 апреля 2012

Сортировка не имеет ничего общего с типом данных в сортируемой коллекции, поэтому не следует применять параметр типа на уровне класса.Также вам нужно будет сравнить объекты, чтобы они реализовали 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...