2013-02-25 55 views
1

讓說我有一個產品類:覆蓋方法或子類中的掛鉤事件?

public class Product 
{ 
    public event ProductColorChangedEventHandler ColorChanged; 
    protected virtual void OnColorChanged() 
    { 
     if (null != ColorChanged) 
      ColorChanged(); 
    } 
} 

如果我從這個類inhering,我需要趕上通知時,有一個顏色的變化,是能夠更好地覆蓋OnColorChanged或掛鉤事件我子類的構造函數?

+0

以上都不是。子類應該調用'base.OnColorChanged()'並在基本調用之上提供它自己的實現。我沒有理由爲此設置一個活動。裝飾者模式浮現在腦海中。 – 2013-02-25 19:25:35

+0

對不起,我可能措辭不正確(我更新OP)它應該說「趕上通知」而不是「得到」。換句話說,當顏色改變事件發生時,我需要在我的子類中做一些事情。 – BlueChameleon 2013-02-25 19:28:08

+0

@BlueChameleon然後你的意思是「訂閱」事件,或「添加事件處理程序」,而不是「catch」或「get」。 – Servy 2013-02-25 19:28:52

回答

3

我認爲首選方法是訂閱事件在你的子類是這樣的:

public class SubProduct : Product 
{ 
    public SubProduct() 
    { 
     ColorChanged += new ProductColorChangedEventHandler(color_changed); 
    } 

    private color_changed(object sender, EventArgs e) 
    { 
     //do stuff 
    } 
} 
0

您可以覆蓋的方法

public override OnColorChanged() 
{ 
    //do stuff 
} 
+1

是的,他*可以*。他問他是否應該*,或者他是否應該訂閱該活動。請注意,使用你的方法,因爲你沒有調用基礎實現,你現在無法調用所有訂閱實際事件的事件處理程序,這就是爲什麼我不喜歡重寫這種方法。 – Servy 2013-02-25 19:44:18

0

掛鉤是不這樣做的正確方法當你還在設計你的應用程序。

訂閱您的子類中的事件,是您的問題的乾淨解決方案。

這是一個很好的閱讀:Hooking on Wiki