2012-04-24 29 views
0
class A 
{ 
    public event EventHanler MyEvent; 
    protected virtual void OnMyEvent(EventArgs e) 
    { 
    if (MyEvent!=null) 
     MyEvent(this, e); 
    } 

    public void DoEvent() 
    { 
    //................ 
     MyEvent(this, new EventArgs()); 
    } 
} 




class B: A 
{ 
    private A a = new A(); 
    public B() 
    { 
    a.MyEvent += MyMethod; 
    } 
    public void MyMethod(object sender, EventArgs e) 
    { 
     Console.WriteLine("Event handler"); 
    } 
} 



class C : A 
{ 
    private A a = new A(); 

    protected override void OnMyEvent(EventArgs e) 
    { 
    base.OnMyEvent(e); 
    Console.WriteLine("OnMyEvent overriding"); 
    } 
} 

我訂閱了該事件並覆蓋了BC類中的方法OnMyEvent()。調用方法base.OnMyEvent(e)的支付方式在方法C.OnMyEvent(...)的開頭。覆蓋方法和訂閱事件是一樣的嗎?

就我而言,這裏沒有任何區別。換句話說,如果我在重寫方法的開始時調用base.OnMyEvent(e),這意味着我只是訂閱該事件嗎?

實際上沒有區別嗎?

回答

1

是有區別的:

  • 調用C.OnMyEvent()提高MyEvent。 (反之,提高MyEvent不會調用C.OnMyEvent()。)
  • B.MyMethod處理MyEvent。因此,募集MyEvent將調用B.MyMethod。 (相反,調用B.MyMethod不會提高MyEvent。)
+0

在換句話說:如果我要處理的事件'A.MyEvent'是那裏處理它的類'B'的,並在任何區別C類? – Alexandre 2012-04-26 09:11:55

+0

它現在寫的方式是,類「B」處理事件,但類「C」不處理。所以是的,這是一個巨大的差異。 – Keith 2012-04-26 15:08:00