2009-02-27 6 views
0

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

public void Add(ResultInfo item) 
{ 

} 

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

+0

Почему метод, используемый для добавления элементов в коллекцию, бесполезен? Как еще вы вкладываете в него предметы? –

+0

Является ли ResultInfo абстрактным базовым классом? – foson

ответ

2

Чтобы определить общий класс, который обрабатывает любой ребенок 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

Мне придётся играть с этой идеей, но она выглядит хорошо. –

0

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

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

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

+0

Метод добавления вообще не бесполезен. Но я не хочу, чтобы они добавляли ResultInfo в UploadResultInfoCollection, поэтому во многих случаях public void Add (ResultInfo ri) будет вызывать ошибки. –

0

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

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

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

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

0

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

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