事前和事后事件
本文关键字:事件 事后 | 更新日期: 2023-09-27 18:24:09
我正在C++/CLI中创建一个用于C#的类库,作为该库的一部分,我将提供System.Windows.Forms.Form
和System.Windows.Forms.Control
的自定义版本System.Windows.Forms.HAForm
和System.Windows.Forms.HAControl
。我想以一种允许我拥有OnPaint_Pre
、OnPaint_Post
和OnPaint
的方式覆盖OnPaint
,因为我每次在完成任何绘画之前都需要处理某些事情,并且在绘画完成后处理一些事情。
虽然这一点很简单,因为这是要从中继承的库中的一个类,但我不想简单地在我的类中创建一个OnPaint
,因为它将被最终开发人员OnPaint
覆盖,即使他们确实调用了base.OnPaint
,事件也会乱序触发。即OnPaint_Pre,我的OnPaint
,OnPaint_Post
,子类OnPaint
。
如何创建一个插入两个事件的类,一个在现有事件之前,另一个在事件之后?
我希望您不要介意我使用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
之前的任何东西。