поднимая события в цепочечных классах - PullRequest
1 голос
/ 25 сентября 2011

скажем, у меня есть три класса: class1, control1 и form1;Form1 создает экземпляр управления.и control1 создает экземпляр class1, позднее генерирует какое-то событие, которое мне нужно «обойти» для form1, чтобы добиться того, чтобы я сделал промежуточную функцию, как показано ниже:

public delegate void TestHandler(String^ str);
public ref Class class1
{
    event TestHandler^ TestHappen;
    void someFunction()
    {
        TestHappen("test string");
    }
};

public ref Class control1
{
    event TestHandler^ TestHappen;
    class1^ class1Obj;
    control1()
    {
        class1Obj= gcnew class1();
        class1Obj->TestHappen+= gcnew TestHandler(this,&control1::onTest);  
    }   
    void onTest(String^ str)
    {
        TestHappen(str);
    }
};

public ref Class form1
{
    control1^ control1Obj;
    form1()
    {
        control1Obj= gcenw control1();
        control1Obj->TestHappen+= gcnew TestHandler(this,&form1::onTest);
    }
    void onTest(String^ str)
    {
        //do something with the string...
    }
};

Я не хочу использовать class1в form1 есть способ удалить промежуточную функцию onTest ().

1 Ответ

3 голосов
/ 26 сентября 2011

Да, если вы используете пользовательское событие, вы можете написать его функции add-handler и remove-handler, чтобы они добавляли и удаляли делегата непосредственно из события другого объекта.

Например:

public ref class control1 // in "ref class", class is lowercase!
{
    class1 class1Obj; // stack-semantics syntax, locks class1Obj lifetime to be same as the containing control1 instance

public:
    event TestHandler^ TestHappen {
        void add(TestHandler^ handler) { class1Obj.TestHappen += handler; }
        void remove(TestHandler^ handler) { class1Obj.TestHappen -= handler; }
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...