2011-09-25 54 views
1

说我有三个类:class1,control1和form1; form1实例化contorl。并控制1实例化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()函数。

+0

这是一个代码味道一丁点儿。但是,您已将Control作为硬基类,并且不支持多重继承。不要担心,你做对了。冒泡事件并不罕见。 –

回答

3

是的,如果您使用自定义事件,则可以编写它的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; } 
    } 
};