Как создать унаследованную коллекцию - PullRequest
0 голосов
/ 27 февраля 2009

Я пишу программу на C #, которая имеет собственную коллекцию. Пользовательская коллекция выполняет некоторые полезные агрегатные функции (AllSuccessful,% Successful и т. Д.) Над своими членами типа ResultInfo. У меня есть несколько классов, производных от ResultInfo (UploadResultInfo, XUploadResultInfo и YUploadResultInfo), и я хотел бы иметь дополнительные коллекции, наследуемые от ResultInfoCollection, которые имеют дополнительные агрегатные функции. Единственная проблема с этим, как указано, состоит в том, что он оставляет бесполезным

public void Add(ResultInfo item)
{ 

}

в коллекции. Уточнение: этот метод принимает аргумент типа ResultInfo, но ResultInfo, добавленный в UploadResultInfoCollection, выдаст ошибку. Существует ли элегантный способ решения моей проблемы? Я рассматривал дженерики, но не знаю, как это будет работать.

Ответы [ 4 ]

2 голосов
/ 27 февраля 2009

Чтобы определить универсальный класс, который обрабатывает любой дочерний элемент ResultInfo, вы просто определяете его как

public class MyCollection<T> : ICollection<T>
where T : ResultInfo
{

     ... the required methods ... just use "T" instead of "ResultInfo" ...

    public void Add(T item) {}
}

Позже вы можете использовать его по

 MyCollection<FooResultInfo> coll = new MyCollection<FooResultInfo>();

Просто попробуйте их использовать, они не слишком сложны, и лучше всего учиться на практике ...

0 голосов
/ 28 февраля 2009

Если все, что вы делаете, - это предоставляете некоторые дополнительные методы для другого существующего типа коллекции, тогда попробуйте просто определить методы расширения для этого типа и использовать обычную универсальную коллекцию.

0 голосов
/ 27 февраля 2009

Подумайте, действительно ли ваши полезные методы должны быть методами экземпляра.

Нужно ли им поддерживать состояние, когда происходят другие операции, или все они возможны с использованием общедоступного (или доступного изнутри) API?

Если это так, просто сделайте их статическими методами (методы расширения, вероятно, хорошая идея) и не беспокойтесь о наследовании. Если методы имеют смысл в IEnumerable <T>, то тем лучше, тем самым вы делаете свои служебные функции значительно более удобными и, следовательно, полезными.

Использование полученного пакета функций просто требует импорта соответствующего пространства имен.

0 голосов
/ 27 февраля 2009

Я не уверен, как у вас остался бесполезный метод Add.

Если коллекция заполняется сама, вы можете сделать метод Add закрытым.

Если вы хотите, чтобы ваши «унаследованные» дополнительные коллекции не отображали метод Add, используйте композицию вместо наследования.

...