Сообщение Re: side virtual method implementation от 12.02.2018 21:09
Изменено 12.02.2018 21:13 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. А потом как-то так:
CS>Есть вот такая иерархия классов
CS>Понятно что все классы выше являются абстрактными.
CS>Теперь нужно соорудить Concrete Bar и Zap добавив к ним имплементацию int do_something()
CS>Наивный подход примерно такой:
CS>но он не работает, т.к. AbstractFoo::do_something() и AbstractFooImpl::do_something() есть разные сущности.
CS>Каким образом это сделать более кошерно ?
Я бы предложил переименовать как-нибудь AbstractFooImpl::do_something. А потом как-то так:
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 при помощи дополнительного шаблонного класса:
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> { };