在c#winform中,我们可以创建一个覆盖基类某些功能的对象,而无需了解基类的实现。例如,我们创建了TouchButton:Button,然后仅覆盖WndProc函数,并且Button的实现对我们不可见。
在C ++中,我有一个接口,例如包含所有虚拟方法的类IButton。在我的dll实现中,它将返回IButton的实现。假设现在我想在不知道Button实现的情况下重写某些方法。

class TouchButton : public IButton
{
 public:
    IButton& mBase;
    TouchButton(IButton& Base)
        : mBase(Base)
    {};
    void SetSize(int x,int y)
    {
        mBase.SetSize(x,y);
    }
    void Visible(bool v)
    {
        mBase.Visible(v);
    }
    void Click(int x,int y)
    {
        // override
    }
}


好的,现在的事情是我只想覆盖一个函数,但是我不得不一次又一次地复制和粘贴这些mBase.Function(...)事情,这绝对不是实现它的优雅方法。有没有更好的方法来归档相同的结果?

提前致谢。

最佳答案

您可以添加一个IButtonForwarder来存储引用并为每个成员执行默认转发:

class IButtonForwarder : public IButton
{
 public:
    IButton& mBase;
    IButtonForwarder(IButton& Base)
        : mBase(Base)
    {};
    virtual void SetSize(int x,int y)
    {
        mBase.SetSize(x,y);
    }
    virtual void Visible(bool v)
    {
        mBase.Visible(v);
    }
    virtual void Click(int x,int y)
    {
        mBase.Visible(v);
    }
};


现在,您的TouchButton只需要传递对象并覆盖适当的成员:

class TouchButton : IButtonForwarder
{
 public:
    TouchButton(IButton& Base)
        : IButtonForwarder(Base)
    {};
    virtual void Click(int x,int y)
    {
      // override
    }
};

07-26 05:17