1

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

虽然这很简单,因为这是要继承的库中的一个类,我不想简单地OnPaint在我的类中创建一个,因为这将被最终开发人员覆盖OnPaint,即使他们确实调用base.OnPaint,事件将无序触发。即 OnPaint_Pre, my OnPaint, OnPaint_Post, sub classes OnPaint

我将如何创建一个插入两个事件的类,一个在现有事件之前,一个在之后?

4

1 回答 1

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

于 2013-07-22T14:08:18.917 回答