2013-07-22 57 views
1

我正在用C++創建一個C++/CLI類庫,並且作爲該庫的一部分,我提供了一個定製版本System.Windows.Forms.FormSystem.Windows.Forms.Control,分別爲System.Windows.Forms.HAFormSystem.Windows.Forms.HAControl。我希望覆蓋OnPaint的方式允許我在任何繪畫完成之前每次都需要處理某些東西,並且在繪製完成後處理一些事情時,我可以使用OnPaint_Pre,OnPaint_PostOnPaintPre_和Post_ Events

儘管這一點很簡單,但由於這是要繼承的庫中的一個類,我不想在我的類中簡單創建OnPaint,因爲這將被最終開發人員OnPaint覆蓋,並且即使他們確實打電話給base.OnPaint,這些事件也會被無序觸發。即OnPaint_Pre,我的OnPaint,OnPaint_Post,子類OnPaint

我將如何創建一個類插入兩個事件,一個在現有事件之前,一個之後?

+1

這很簡單,重寫OnPaint :)不,用虛擬方法的問題是,一個不知情的客戶端程序員總是會讓你失望。除非你在你的方法上使用* sealed *關鍵字,否則他們不能。 –

回答

1

我希望你不要使用C#語法,而不是C++/CLI介意我...

可以使HAForm/HAControl OnPaint中能戰勝密封,並創建一個派生類可以覆蓋一個新的虛擬功能。你甚至可以用一箇中間類給新的虛函數相同的名稱:

public class HAControlBase : Control 
{ 
    protected virtual void OnPaintPre(PaintEventArgs e) { } 
    protected virtual void OnPaintPost(PaintEventArgs e) { } 

    internal virtual void OnPaintImpl(PaintEventArgs e) { 
     base.OnPaint(e); 
    } 
    protected sealed override OnPaint(PaintEventArgs e) { 
     OnPaintPre(e); 
     OnPaintImpl(e); 
     OnPaintPost(e); 
    } 
} 

public class HAControl : HAControlBase 
{ 
    internal sealed override void OnPaintImpl(PaintEventArgs e) { 
     OnPaint(e); 
    } 
    protected new virtual void OnPaint(PaintEventArgs e) { 
     base.OnPaintImpl(e); 
    } 
} 

現在,即使一個派生類覆蓋HAControl.OnPaint,之後HAControlBase.OnPaint已與OnPaintPre完成了它纔會被調用,沒有可以覆蓋Control.OnPaint(因爲該覆蓋是sealed)可以在OnPaintPre之前調用任何東西。