| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > .NET для новичков > List<> с событием |
| Автор: Heinzz 27.8.2009, 19:38 |
| Как можно сделать MyList<> с событием "Changing", но не с нуля, а унаследовав от встроенного List<> все его методы и свойства? Удобный был бы ... |
| Автор: mihryak 27.8.2009, 22:31 | ||
| строго говоря - никак, у List<T> методы не виртуальные но есть такой вариант
вроде бы, всё круто, но без неприятного момента не обошлось - если ты будешь передавать этот экземпляр типа в метод или же объявишь экземпляр как List (IEnumerable, ICollection и т.п.), то твоя карета превратится снова в тыкву, т.е. везде при использовании ты обязан будешь писать конкретный тип, а не базовый класс или интерфейс, иначе метод вызовется именно базовый. если это не проблема - тогда преград нету |
| Автор: Skynin 27.8.2009, 22:32 |
| как понимаю, хочется вызывать событие при изменении List'а. Общее рассуждение для таких случаев: Если методы класса, в которые мы хотим внедрить событие объявлены виртуальным, то наследуем. Если нет, то наследование не позволит нам вызвать родной метод базового класса, а значит нужно агрегировать. И в новом классе объявить все методы вложенного, в которых будет просто - вызов метода вложенного. Если нам нужно сохранить преемственность типов, то реализуем интерфейс вложенного класса, и при использовании по интерфейсу не будет видно, наследовали мы, или агрегировали. Если у класса, к которому мы хотим подцепить событие нет реализованных интерфейсов... то печально, единой типизации, для "подмены" мы не добьемся. |
| Автор: mihryak 27.8.2009, 22:37 |
| Skynin, агрегация - это, конечно, хорошо, но в таком случае придётся реализовать все штук сорок методов, топик-стартер, как мне показалось, хотел бы этого избежать кроме того, несмотря на интерфейсы, результат будет несовместим с List<T> (как и мой) впрочем, ему (тс) виднее |
| Автор: diadiavova 28.8.2009, 01:19 |
| Heinzz, а это принципиально, чтобы наследование производилось именно от List ? Есть ведь и другие коллекции, например System.Collections.ObjectModel.Collection<T>. Если наследовать от неё, то без проблем. |
| Автор: Skynin 28.8.2009, 08:37 | ||||||
Мне и самому интересно, как из сферы сделать куб, но так чтобы осталась сфера
Это претензия к автору класса
Не будет конечно. IList<T>, ICollection<T>, IEnumerable<T>, IList, ICollection, IEnumerable - это не List<T> Но я описывал общий подход, потому что вопрос такой - нередко возникает. Вообще говоря, List<T> и должен использоваться по минимуму. Если по великой ООП науке. Волновать должны типы, которые и указаны интерфейсами, а не реализации, что наследуются. |
| Автор: mihryak 28.8.2009, 08:57 |
| Skynin, indeed |
| Автор: QryStaL 28.8.2009, 08:57 |
| Heinzz, http://msdn.microsoft.com/en-us/library/ms668604.aspx |