Пользовательские Коллекции от общего к определенному - PullRequest
1 голос
/ 11 марта 2012

У меня есть следующая универсальная коллекция:

public class XList<Object> : List<Object>
{
    public XList() : base()
    {

    }
    public XList(Object[] values) : base(values)
    {

    }
    public void Add(XList<Object> inputObjects)
    {
        if (inputObjects == null) { return; }
        if (inputObjects.Count == 0) { return; }
        foreach (Object currentObject in inputObjects) { Add(currentObject); }
    }
}

Я успешно использую эту коллекцию, и это общие методы со многими типами данных. Например:

XList<int>
XList<String>
XList<XFolder>

(XFolder - это пользовательский класс, который ссылается на папку)

Теперь я хочу встроить метод в вышеприведенный класс, который специфичен для списка XFolder . Например, метод, который сортирует папки от самого длинного до наименьшего пути. Нужно ли создавать новую пользовательскую коллекцию или я могу сделать это в вышеприведенном классе, чтобы сохранить ее общие свойства / методы?

РЕДАКТИРОВАТЬ: во избежание недоразумений

@ Мэтт Берланд: Я не имею в виду гетерогенную коллекцию. Гетерогенная коллекция - это коллекция, в которой разные типы данных хранятся в одной коллекции. Каждая коллекция того, что я имею в виду, хранит данные одного и того же типа в одной и той же коллекции, но может хранить разные типы данных в разных коллекциях (одного и того же типа, а именно XList).

Моя проблема в том, что я хочу иметь возможность выполнять разные методы для каждой коллекции в соответствии с их типом:

Коллекция целых чисел должна иметь математические методы (например, добавить все числа)

Коллекция строк должна иметь строковые методы (например, сортировать строки в алфавитном порядке)

В наборе продуктов должны быть методы, применимые к продуктам (сгруппируйте их по типам продуктов)

Я бы хотел сделать в своей основной программе следующее:

XList<int> myNumberList = new XList<int>; myNumberList.Add(....//fill list with integers
XList<String> myStringList = new XList<String>; myStringList.Add(....//fill list with strings
XList<Food> myFoodList = new XList<Food>; myFoodList.Add(....//fill list with foods

int sumOfNumbers = myNumberList.sum();
myStringList.sort();
XList<Food> mySweetFoodList = myFoodList.getSweets();

В этом примере все мои коллекции являются коллекциями XList. Но у них есть разные методы в зависимости от их типов:

XList имеет метод sum ()

XList имеет метод sort ()

XList имеет метод getSweets ()

Я не знаю, возможно ли это. Я даже не знаю, правильно ли я думаю. На данный момент я придерживаюсь ответа JaredPar и использую XListExtension

Ответы [ 3 ]

2 голосов
/ 11 марта 2012

Если метод выполняет что-то определенное для XFolder, его не должно быть в базовом базовом классе.Вы должны выполнить одно из следующих действий:

Вы можете создать специализированный класс:

public class XFolderList : XList<XFolder>
{    
    // put your XFolder specific method here    
}

Или вы можете создать метод расширения:

public static class XFolderExtensions
{    
    public static void SpecialXfolderMethod(this XList<XFolder> list)
    {
       // do special things here, change the return type if you need to
    }
}
1 голос
/ 11 марта 2012

Похоже, вы хотите иметь определенный метод сортировки для XList экземпляров, которые создаются с типом XFolder.Это отличный пример использования метода расширения

public static class XListExtensions { 
  public static SortFolders(this XList<XFolder> list) {
    // Do the sort
  }
}

. Я бы не использовал здесь наследование для решения проблемы.Метод сортировки не представляет новый тип объекта, а представляет специализированное поведение для конкретного экземпляра.

Кроме того, я бы не стал выводить из List<T> полностью здесь.Показанный вами пример не создает новый тип списка с переопределенным поведением.Он просто добавляет несколько методов специализации поверх него.Выбор здесь метода расширения позволяет использовать поведение для всех значений List<T>.

0 голосов
/ 11 марта 2012

Если вы добавите IComparable в XFolder, вы можете просто сортировать свой список XList.Или, иметь XSortedList, который всегда сортирует, если вы не хотите, чтобы ваш XList.Это решает только сортировку, поэтому, если вам понадобится больше дополнений в будущем, возможно, вам подойдет метод расширения или специализированный класс.

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