Код: Выделить всё
class FooRed : public IFoo
{
public:
FooRed() = default;
virtual double Compute() override final; //Inherited from IFoo.
}
На более позднем этапе разработки было решено, что для расчета может быть полезно изменить режимы с FooRed на FooBlue во время выполнения. Для этого пишется шаблонный класс
Код: Выделить всё
template
class Toggleable:
{
protected:
std::shared_ptr _instance;
bool _state;
public:
Toggleable();
T* const Get() const {return _instance.get()};
const shared_ptr& GetRef() const {return _instance};
virtual void Toggle(); //sets _instance to the correct type.
}
Код: Выделить всё
class FooManager : public Toggleable
{
public:
virtual void Toggle() override; //Inherited from Toggleable
}
Однако моим первым желанием было сделать так, чтобы FooManager также реализовывал IFoo, что-то вроде шаблона контейнера:
Код: Выделить всё
class FooManager : public Toggleable, public IFoo
{
public:
virtual void Toggle() override; //Inherited from Toggleable
virtual double Compute() override {return Get()->Compute();} //Inherited from IFoo
}
Я также считаю, что это более логично для конструкторов, поскольку, если Foo является переключаемым, а Bar нет, то подобъект, который должен выполнять и то, и другое, создается с помощью SubObject(MyFoo->GetRef(), MyBar) в неуклюжей смеси ссылок на общие указатели и общие указатели. Но мой коллега сказал, что такого рода множественное наследование — плохая практика, и что эта структура запутывает поведение менеджера и настоящего Foo.
Это хорошая практика? Как правильно реализовать такой переключатель во время выполнения, который должен переключаться между несколькими подэлементами?
Подробнее здесь: https://stackoverflow.com/questions/783 ... -selection
Мобильная версия