2015-04-10 9 views
0

В C# winform мы можем создать объект, который переопределяет определенную функцию базового класса, не зная реализации базы. Например, мы создаем TouchButton: Button, затем переопределяем только функцию WndProc, и реализация Button не отображается нам. В C++ у меня есть интерфейс, например класс IButton, который содержит все виртуальные методы. В моей реализации dll она вернет реализацию IButton. Скажем, теперь я хочу переопределить определенный метод, не зная реализации Button.C# способ переопределения в C++

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 (...) вещь снова и снова, это, безусловно, не элегантный способ сделать Это. Есть ли лучший способ архивировать один и тот же результат?

Заранее спасибо.

+1

В C# 'мы создаем TouchButton: Button затем переопределяет только функцию WndProc, и реализация кнопки не видна для нас' - Я думаю, что это утверждение неверно (кнопка полностью доступна) –

+0

Нет причин, по которым вы не можете извлечь из ac lass, реализация которого скрыта (а не только встроенная в классе). – chris

+1

Что не так с классом TouchButton: public Button '(без меня)? –

ответ

1

Вы можете добавить 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 
    } 
}; 
+1

В этом подходе есть одно предостережение, которое, я думаю, нужно упомянуть: если реализация 'IButton', хранящаяся в' mBase', отправляет себя (ее 'this') в любом месте, эта другая сторона полностью не знает о« TouchButton »и будет обходить любой из его переопределения. – Angew

Смежные вопросы