Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > List<> с событием


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

Автор: mihryak 27.8.2009, 22:31
строго говоря - никак, у 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 и т.п.), то твоя карета превратится снова в тыкву, т.е. везде при использовании ты обязан будешь писать конкретный тип, а не базовый класс или интерфейс, иначе метод вызовется именно базовый.
если это не проблема - тогда преград нету

Автор: 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
Цитата

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

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

Цитата

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

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

Цитата

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

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

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

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


Автор: mihryak 28.8.2009, 08:57
Skynin, indeed smile

Автор: QryStaL 28.8.2009, 08:57
Heinzz, http://msdn.microsoft.com/en-us/library/ms668604.aspx

Автор: Heinzz 28.8.2009, 18:45
Цитата(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 если я правильно понял

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)