2011-09-27 110 views
0

我有一個包含公共事件(SomeEvent)的基類(讓它爲SomeBaseClass),我有一個派生類,我想在其中引發這個事件,但是我不能(!!)VS 2010說我(在派生類中的行:base.SomeEvent!= null)「事件'SomeBaseClass.SomeEvent'只能出現在+ =或 - =」的左側。如果我在這個基礎上取代它是沒有意義的。派生類中基類的公共事件

+0

你可以顯示你的事件定義和你如何設置它? –

+0

公共事件EventHandler StateChanged; – Vasya

回答

2

不,這是絕對正確的 - 事件是事件(與訂閱和退訂)儘可能派生類而言。如果您的基類想讓派生類提升事件,那麼它應該包含一個受保護的方法(例如,對於類型爲EventHandler類型的名爲Foo的事件,通常使用虛擬OnFoo(EventHandler))。請注意,如果你寫在C#像這樣的現場般的事件:

public event EventHandler Foo; 

這實際上宣告私人場稱爲Foo(這是類的嵌套類訪問)和公共事件(這隻包括訂閱/取消訂閱)。你可以聲明自己「定製」事件是這樣的:

protected EventHandler foo; 
// Note: not thread-safe. Only present for demonstration purposes. 
public event EventHandler Foo 
{ 
    add { foo += value; } 
    remove { foo -= value; } 
} 

,然後派生類將有機會獲得現場......但我不會建議。 (我很少申報非私有字段,比常數等。)

2

你需要做的正確的方式(即在C#中的慣用方式)

public class Base { 
    public event EventHandler<EventArgs> SomeEvent; 
    protected virtual void OnSomeEvent(EventArgs e) { 
     EventHandler<EventArgs> handler = SomeEvent; 
     if (handler != null) { 
      handler(this, e); 
     } 
    } 
} 

public class Derived { 
    protected virtual void OnSomeEvent(EventArgs e) { 
     // derived event handling here 
     // then invoke the base handler 
     base.OnSomeEvent(e); 
    } 
} 

,你不喜歡它的原因這是因爲事件只能從定義類中調用。