事前和事后事件

本文关键字:事件 事后 | 更新日期: 2023-09-27 18:24:09

我正在C++/CLI中创建一个用于C#的类库,作为该库的一部分,我将提供System.Windows.Forms.FormSystem.Windows.Forms.Control的自定义版本System.Windows.Forms.HAFormSystem.Windows.Forms.HAControl。我想以一种允许我拥有OnPaint_PreOnPaint_PostOnPaint的方式覆盖OnPaint,因为我每次在完成任何绘画之前都需要处理某些事情,并且在绘画完成后处理一些事情。

虽然这一点很简单,因为这是要从中继承的库中的一个类,但我不想简单地在我的类中创建一个OnPaint,因为它将被最终开发人员OnPaint覆盖,即使他们确实调用了base.OnPaint,事件也会乱序触发。即OnPaint_Pre,我的OnPaintOnPaint_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之前的任何东西。