![]() |
Модераторы: Partizan, gambit |
![]() ![]() ![]() |
|
Heinzz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 381 Регистрация: 12.12.2008 Где: .net Репутация: 3 Всего: 9 |
Как можно сделать MyList<> с событием "Changing", но не с нуля, а унаследовав от встроенного List<> все его методы и свойства?
Удобный был бы ... |
|||
|
||||
mihryak |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 731 Регистрация: 28.4.2007 Где: С-Пб Репутация: 10 Всего: 36 |
строго говоря - никак, у List<T> методы не виртуальные
но есть такой вариант
вроде бы, всё круто, но без неприятного момента не обошлось - если ты будешь передавать этот экземпляр типа в метод или же объявишь экземпляр как List (IEnumerable, ICollection и т.п.), то твоя карета превратится снова в тыкву, т.е. везде при использовании ты обязан будешь писать конкретный тип, а не базовый класс или интерфейс, иначе метод вызовется именно базовый. если это не проблема - тогда преград нету Это сообщение отредактировал(а) mihryak - 27.8.2009, 22:34 |
|||
|
||||
Skynin |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 359 Регистрация: 1.7.2007 Где: Харьков Репутация: 0 Всего: 10 |
как понимаю, хочется вызывать событие при изменении List'а.
Общее рассуждение для таких случаев: Если методы класса, в которые мы хотим внедрить событие объявлены виртуальным, то наследуем. Если нет, то наследование не позволит нам вызвать родной метод базового класса, а значит нужно агрегировать. И в новом классе объявить все методы вложенного, в которых будет просто - вызов метода вложенного. Если нам нужно сохранить преемственность типов, то реализуем интерфейс вложенного класса, и при использовании по интерфейсу не будет видно, наследовали мы, или агрегировали. Если у класса, к которому мы хотим подцепить событие нет реализованных интерфейсов... то печально, единой типизации, для "подмены" мы не добьемся. |
|||
|
||||
mihryak |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 731 Регистрация: 28.4.2007 Где: С-Пб Репутация: 10 Всего: 36 |
Skynin, агрегация - это, конечно, хорошо, но в таком случае придётся реализовать все штук сорок методов, топик-стартер, как мне показалось, хотел бы этого избежать
кроме того, несмотря на интерфейсы, результат будет несовместим с List<T> (как и мой) впрочем, ему (тс) виднее Это сообщение отредактировал(а) mihryak - 27.8.2009, 22:45 |
|||
|
||||
diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 18 Всего: 142 |
Heinzz, а это принципиально, чтобы наследование производилось именно от List ?
Есть ведь и другие коллекции, например System.Collections.ObjectModel.Collection<T>. Если наследовать от неё, то без проблем. -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит ![]() |
|||
|
||||
Skynin |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 359 Регистрация: 1.7.2007 Где: Харьков Репутация: 0 Всего: 10 |
Мне и самому интересно, как из сферы сделать куб, но так чтобы осталась сфера ![]()
Это претензия к автору класса ![]()
Не будет конечно. IList<T>, ICollection<T>, IEnumerable<T>, IList, ICollection, IEnumerable - это не List<T> Но я описывал общий подход, потому что вопрос такой - нередко возникает. Вообще говоря, List<T> и должен использоваться по минимуму. Если по великой ООП науке. Волновать должны типы, которые и указаны интерфейсами, а не реализации, что наследуются. |
||||||
|
|||||||
mihryak |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 731 Регистрация: 28.4.2007 Где: С-Пб Репутация: 10 Всего: 36 |
Skynin, indeed
![]() |
|||
|
||||
QryStaL |
|
|||
![]() Intellectual feast ![]() ![]() Профиль Группа: Участник Сообщений: 914 Регистрация: 30.11.2005 Репутация: 10 Всего: 32 |
Heinzz, ObservableCollection
-------------------- I don't need a reason being who I am... |
|||
|
||||
Heinzz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 381 Регистрация: 12.12.2008 Где: .net Репутация: 3 Всего: 9 |
Да, спасибо, это вариант! Мне нравится ![]() что же у List<> методы не сделали virtual ![]() Добавлено через 1 минуту и 1 секунду Спасибо, но это для WPF если я правильно понял |
|||
|
||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | .NET для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |