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

Поиск:

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


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 2
Всего: 98



Добрый день.

Понадобилось сделать коллекцию, члены которой должны уведомлять ее о своих изменениях:

Код

public class FieldsList<T> : List<T> where T : DataField


так:
Код

            public new void Add (T field)
            {
                field.Changes += new DataField.FieldChangedEventHandler(FieldChanged);

                ...
            }

я подписываюсь на уведомления...

обработчик:
Код

            private void FieldChanged (T changedField, StateTypes changeType)
            {
            }


класс поля
Код

        public class DataField
        {

            public delegate void FieldChangedEventHandler (DataField changedField, StateTypes changeType);
            public event FieldChangedEventHandler Changes;


но проблема в том, что на строке 
field.Changes += new DataField.FieldChangedEventHandler(FieldChanged);
я получаю ошибку "No overload for 'FieldChanged' matches delegate 'DataField.FieldChangedEventHandler'"

Что тут можно сделать?

С уважением...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
marcusmae
Дата 24.3.2008, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


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

Репутация: 22
Всего: 39



_hunter, эта ошибка означает, что сигнатура метода FieldChanged не соответствует той, что требует делегат FieldChangedEventHandler. То есть, нужно поправить типы параметров метода FieldChanged : у Вас в одном месте T, а в другом - DataField.


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
_hunter
Дата 24.3.2008, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 2
Всего: 98



Что эта ошибка означает я знаю smile И что если вместо "public new void Add (T field)" написать "public new void Add (DataField field)" -- все заработает -- тоже догадываюсь... Но весь смысл именно в generic'e. И работать заставить хотелось бы именно такой вариант.
Не понятно почему не работает именно мой вариант -- я, ведь, тип generic'а указываю: where T : DataField...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
marcusmae
Дата 24.3.2008, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


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

Репутация: 22
Всего: 39



_hunter, если не спрашивать, какой будет толк от желаемой конструкции, то дженерик можно воткнуть прямо в делегат. Но тогда функциональность по добавлению-удалению события возможно придётся прописывать вручную через аксессоры add/remove и приводить там типы что ли...

Это сообщение отредактировал(а) marcusmae - 24.3.2008, 20:05


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
_hunter
Дата 24.3.2008, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 2
Всего: 98



Какой толк?.. -- Коллекция будет знать о изменениях своих членов...

Насчет воткнуть в делегат: это как?
public class DataField<T>
        {
                public delegate void FieldChangedEventHandler (T changedField, StateTypes changeType);
-- так DataField это вполне обычный класс... Шаблонность ему совсем не нужна...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
marcusmae
Дата 24.3.2008, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


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

Репутация: 22
Всего: 39



Цитата(_hunter @  24.3.2008,  20:09 Найти цитируемый пост)
Шаблонность ему совсем не нужна...


По идеи, да, но в момент связывания с обработчиком, требуется точное знание типа :

Код

    public abstract class DataFieldBase<T>
    {
        public delegate void FieldChangedEventHandler<A>(A changedField);
        public abstract event FieldChangedEventHandler<T> Changes;
    }

    public class FieldsList<T> : List<T> where T : DataFieldBase<T>
    {

        public new void Add(T field)
        {
            field.Changes += new DataFieldBase<T>.FieldChangedEventHandler<T>(FieldChanged);
        }

        private void FieldChanged(T changedField)
        {
        }
    }


Применение :

Код

    public class MyDataField : DataFieldBase<MyDataField>
    {
        public override event DataFieldBase<MyDataField>.FieldChangedEventHandler<MyDataField> Changes;

        public void Change()
        {
            this.Changes(this);
        }
    }

    public class Test : FieldsList<MyDataField>
    {
    }


Корявенько smile 


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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