Шаблон дизайна обертки - PullRequest
0 голосов
/ 05 августа 2011

Скажите, у меня есть класс:

class B;
class A{
public:
    A();
    virtual B foo();
}

определено в стороннем компоненте. Я хочу обернуть классы A и B, в результате myA и myB. Теперь я не должен иметь доступ к классу A и классу B извне, а скорее иметь одинаковую функциональность для myA и myB. Функция foo () может быть вызвана из стороннего модуля.

Я бы предпочел сделать это, используя наследование, а не инкапсуляцию.

Итак, есть 2 проблемы:

  1. Вызов a-> myFoo () (необходимо переименовать методы из-за одинаковой сигнатуры и другого возвращаемого типа) должен вызывать A :: foo (), если a имеет тип myA.
  2. Вызов a-> myFoo () должен вызвать myA2 :: myFoo (), если a относится к классу типов myA2 :: myA.

Любые предложения о том, как сделать это элегантно? Я придумала несколько решений, но предпочитаю по-новому взглянуть на все это.

EDIT:

Просто теоретический вопрос. На самом деле мне не нужно этого делать, я просто думаю о том, как этого достичь.

EDIT2:

myA2 - это класс, расширяющий myA. До шаблона он назывался A2 (класс, который расширил класс A из стороннего модуля).

Ответы [ 2 ]

2 голосов
/ 05 августа 2011

Я не понимаю, почему вы предпочитаете делать это с наследованием вместо инкапсуляции. Вообще говоря, расширение класса, который вы оборачиваете, является «неправильным» способом реализации шаблона обертки, тем более что вы обычно хотите переопределить интерфейс в процессе. В классе myA у вас будет поле типа A, которое содержит экземпляр класса A, который методы myA могут вызывать по мере необходимости. Если я не понял, чего вы хотите достичь, это самый элегантный способ выполнить то, что вы хотите.

0 голосов
/ 05 августа 2011

Вы должны иметь возможность объявлять имена / параметры функций аналогичным образом.Проверьте: странное наследование раздел: [23.9] В чем смысл, Предупреждение: Derived::f(char) скрывает Base::f(double)?в 3-м блоке кода.

Также показан синтаксис для вызова базовых методов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...