контейнер с элементами потоками базового
От: Аноним  
Дата: 01.10.12 19:06
Оценка:
Всем привет!
Есть класс, например Container, реализующий IList<Item> . Реализует специальные телодвижения при добавлениях/удалениях/заменах итемов и ещё всякое. Для хранения списка внутри используется приватная переменная List<Item> _list.
Теперь возник частный случай когда все элементы контейнера будут потомками от Item-а, например класса ItemEx. Хочется переменные для контейнера в этом случае объявлять так: IList<ItemEx> . И ещё (2) будут места где надо будет их кастовать к классу Container, тк в нём есть спец-е полезные методы которые будут использоваться (в них нет завязок на классы потомки от Item-а).

Как этого достичь наименьшими усилиями? Вар-ты которые пришли в голову:
1. самый напрашивающийся — кастовать инстанс класса Container к IList<ItemEx> дает рантайм ошибку. в принципе вроде оно и понятно, в контейнере этот интерфейс явно-то не задекларирован, но с другой стороны в контейнере же элементы правильного типа, чо бы C# не ругаться в рантайме когда элемент окажется несоотвествующего типа? в идеале хотелось бы именно этого решения. тк по сути контейнер правильный, весь нужный функционал им реализуется, особой работы с элементами потомками в нем также нет, и зависимостей от классов потомков Item-а нет. как уговорить компилятор хз.

2.тк самый очевидный и вероятный вар-т не проканал, стал думать дальше. прочитал про covariance, вроде понятно чо пишут, но несмог осилить как это может здесь помочь и может ли?

3. переделать класс Container на Сontainer<T> не вариант, т.к. цепляется офигенный шлейф изменений. и нет простой возможности изменить его создание. т.к. там где он создается (рез-таты запросов к спец. репозиторию) написан универсальный обобщенный код и как там создать контейнер с заранее неизвестным уточнением типа элемента — хз.

Спасибо
ps. после таких мозговывертов, питаются особо теплые чувства к динамическим языкам
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.