CLI / C ++ Virtual EventHandler - PullRequest
       27

CLI / C ++ Virtual EventHandler

1 голос
/ 01 сентября 2011

У меня есть класс A, который реализует интерфейс I.

В интерфейсе I есть объявление:

virtual event System::EventHandler ^eh;

В заголовочном файле A я реализую это с помощью объявления similare:

virtual event System::EventHandler ^eh;

в файле cpp файла A Я хочу назначить делегат события другой переменной:

EventHandler ^eh2 = eh;

Это дает ошибку

Ошибка 285, ошибка C3918: использование требует, чтобы 'eh' было данными

Я тоже пытаюсь

EventHandler^ eh2 = gcnew System::EventHandler(eh);

Это дает ошибку:

Ошибка 285 Ошибка C3924: ошибка в аргументе № 1 конструктора делегата вызов 'System :: EventHandler':

1 Ответ

4 голосов
/ 01 сентября 2011

Ключевое слово event явно запрещает доступ к такому событию.Единственными допустимыми операциями являются добавление обработчика (оператор + =), удаление одного (оператор = =) и создание события.Если вы хотите получить доступ к базовому объекту делегата, вам нужно предоставить методы добавления и удаления, чтобы обернуть объект делегата, вместо того, чтобы использовать объекты по умолчанию, которые генерирует компилятор.Например:

public interface class IFoo {
    event EventHandler^ eh;
};

ref class Bar : IFoo {
private:
    EventHandler^ dlg;
public:
    event EventHandler^ eh {
        virtual void add(EventHandler^ handler) { dlg += handler; }
        virtual void remove(EventHandler^ handler) { dlg -= handler; }
    };
public:
    void test() {
        EventHandler^ copy = dlg;
        // etc.., fire for example
        copy(this, EventArgs::Empty);
    }
};

Подумайте, действительно ли это то, что вы хотите сделать, это вряд ли будет правильным.

...