Информация об изменениях

Сообщение Re: side virtual method implementation от 12.02.2018 21:09

Изменено 12.02.2018 21:14 rg45

Re: side virtual method implementation
Здравствуйте, 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_someting_impl();
  }
};

class ConcreteBar : public AbstractFooImplMixer<Bar> { };  
class ConcreteZap : public AbstractFooImplMixer<Zap> { };
Re: side virtual method implementation
Здравствуйте, 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_someting_impl();
  }
};

class ConcreteBar : public AbstractFooImplMixer<Bar> { };  
class ConcreteZap : public AbstractFooImplMixer<Zap> { };