Re: side virtual method implementation
От: rg45 СССР  
Дата: 12.02.18 21:09
Оценка: 42 (2) +3
Здравствуйте, c-smile, Вы писали:

CS>Есть вот такая иерархия классов

CS>Понятно что все классы выше являются абстрактными.
CS>Теперь нужно соорудить Concrete Bar и Zap добавив к ним имплементацию int do_something()
CS>Наивный подход примерно такой:
CS>но он не работает, т.к. AbstractFoo::do_something() и AbstractFooImpl::do_something() есть разные сущности.
CS>Каким образом это сделать более кошерно ?

Я бы предложил переименовать как-нибудь AbstractFooImpl::do_something. А потом подмешивать AbstractFooImpl при помощи дополнительного шаблонного класса:


class AbstractFoo {
  virtual int do_something() = 0;
};

class Manipula {};

class Bar : public AbstractFoo, public Manipula {};
class Zap : public AbstractFoo, public Manipula {};

#if WINDOWS 
class AbstractFooImpl {
  int do_something_impl() { return 0; }
};
#elif MACOS
  ...
#endif

template <typename Base>
class AbstractFooImplMixer : public Base, public AbstractFooImpl {
  int do_something() override {
    return AbstractFooImpl::do_something_impl();
  }
};

class ConcreteBar : public AbstractFooImplMixer<Bar> { };  
class ConcreteZap : public AbstractFooImplMixer<Zap> { };
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 12.02.2018 21:15 rg45 . Предыдущая версия . Еще …
Отредактировано 12.02.2018 21:14 rg45 . Предыдущая версия .
Отредактировано 12.02.2018 21:13 rg45 . Предыдущая версия .
Отредактировано 12.02.2018 21:10 rg45 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.