Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> List<> с событием 
:(
    Опции темы
Heinzz
Дата 27.8.2009, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 12.12.2008
Где: .net

Репутация: 3
Всего: 9



Как можно сделать MyList<> с событием "Changing", но не с нуля, а унаследовав от встроенного List<> все его методы и свойства? 
Удобный был бы ...


--------------------
user posted image
PM MAIL   Вверх
mihryak
Дата 27.8.2009, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 10
Всего: 36



строго говоря - никак, у List<T> методы не виртуальные
но есть такой вариант
Код

    class ListWithEvents<T> : List<T>
    {
        public event EventHandler<EventArgs> Changed;

        public new void Add(T item)
        {
            base.Add(item);
            if (Changed != null)
            {
                Changed(this, new EventArgs());
            }
        }

        // та же штука со всеми изменяющими список методами
    }

вроде бы, всё круто, но без неприятного момента не обошлось - если ты будешь передавать этот экземпляр типа в метод или же объявишь экземпляр как List (IEnumerable, ICollection и т.п.), то твоя карета превратится снова в тыкву, т.е. везде при использовании ты обязан будешь писать конкретный тип, а не базовый класс или интерфейс, иначе метод вызовется именно базовый.
если это не проблема - тогда преград нету

Это сообщение отредактировал(а) mihryak - 27.8.2009, 22:34
PM MAIL ICQ   Вверх
Skynin
Дата 27.8.2009, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 359
Регистрация: 1.7.2007
Где: Харьков

Репутация: 0
Всего: 10



как понимаю, хочется вызывать событие при изменении List'а.

Общее рассуждение для таких случаев:
Если методы класса, в которые мы хотим внедрить событие объявлены виртуальным, то наследуем.
Если нет, то наследование не позволит нам вызвать родной метод базового класса, а значит нужно агрегировать.
И в новом классе объявить все методы вложенного, в которых будет просто - вызов метода вложенного.

Если нам нужно сохранить преемственность типов, то реализуем интерфейс вложенного класса, и при использовании по интерфейсу не будет видно, наследовали мы, или агрегировали.

Если у класса, к которому мы хотим подцепить событие нет реализованных интерфейсов... то печально, единой типизации, для "подмены" мы не добьемся.
PM MAIL WWW ICQ Skype GTalk YIM MSN   Вверх
mihryak
Дата 27.8.2009, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 10
Всего: 36



Skynin, агрегация - это, конечно, хорошо, но в таком случае придётся реализовать все штук сорок методов, топик-стартер, как мне показалось, хотел бы этого избежать
кроме того, несмотря на интерфейсы, результат будет несовместим с List<T> (как и мой)
впрочем, ему (тс) виднее

Это сообщение отредактировал(а) mihryak - 27.8.2009, 22:45
PM MAIL ICQ   Вверх
diadiavova
Дата 28.8.2009, 01:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 18
Всего: 142



Heinzz, а это принципиально, чтобы наследование производилось именно от List ?
Есть ведь и другие коллекции, например System.Collections.ObjectModel.Collection<T>. Если наследовать от неё, то без проблем.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Skynin
Дата 28.8.2009, 08:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 359
Регистрация: 1.7.2007
Где: Харьков

Репутация: 0
Всего: 10



Цитата

это, конечно, хорошо, но в таком случае придётся реализовать

Мне и самому интересно, как из сферы сделать куб, но так чтобы осталась сфера smile

Цитата

все штук сорок методов

Это претензия к автору класса smile Почему же он не предусмотрел возможность наследования его класса, и не сделал все 40 методов - virtual.

Цитата

несмотря на интерфейсы, результат будет несовместим с List<T>

Не будет конечно. IList<T>, ICollection<T>, IEnumerable<T>, IList, ICollection, IEnumerable - это не List<T>

Но я описывал общий подход, потому что вопрос такой - нередко возникает. 

Вообще говоря, List<T> и должен использоваться по минимуму. Если по великой ООП науке. Волновать должны типы, которые и указаны интерфейсами, а не реализации, что наследуются.


PM MAIL WWW ICQ Skype GTalk YIM MSN   Вверх
mihryak
Дата 28.8.2009, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 10
Всего: 36



Skynin, indeed smile
PM MAIL ICQ   Вверх
QryStaL
Дата 28.8.2009, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Intellectual feast
**


Профиль
Группа: Участник
Сообщений: 914
Регистрация: 30.11.2005

Репутация: 10
Всего: 32





--------------------
I don't need a reason being who I am...
PM MAIL ICQ   Вверх
Heinzz
Дата 28.8.2009, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 12.12.2008
Где: .net

Репутация: 3
Всего: 9



Цитата(diadiavova @  28.8.2009,  01:19 Найти цитируемый пост)
Heinzz, а это принципиально, чтобы наследование производилось именно от List ?
Есть ведь и другие коллекции, например System.Collections.ObjectModel.Collection<T>. Если наследовать от неё, то без проблем. 


Да, спасибо, это вариант! Мне нравится smile 
что же у List<> методы не сделали virtual smile

Добавлено через 1 минуту и 1 секунду
Цитата(QryStaL @  28.8.2009,  08:57 Найти цитируемый пост)
Heinzz, ObservableCollection 

Спасибо, но это для WPF если я правильно понял


--------------------
user posted image
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0784 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.