このような問題にどのように対処するかを知りたいです。
私はクラスを持っていますFoo
:
class Foo
{
public:
Foo() { }
~Foo() { }
float member1() { return _member1; }
private:
float _member1;
// other members etc...
}
とりわけ、Foo インスタンスへのポインターのコンテナーを保持するコンテナー クラス
class FooContainer
{
public:
FooContainer() { }
~FooContainer() { }
void addFoo(Foo* f) {_foos.push_back(f);}
private:
boost::ptr_vector<Foo> _foos;
}
私の問題は次のとおりです。実行時に、GUI からの指示に応じて、新しい (まったく異なる) メンバーを Foo に「追加」する必要があります。次のような 2 つの「デコレータ」を作成することで、この問題に対処できます。
class Decorator1
{
public:
int alpha() { return _alpha; }
float beta() { return _beta; }
private:
int _alpha;
float _beta;
}
class Decorator2
{
typedef std::complex<float> cmplx;
public:
cmplx gamma() { return _gamma; }
double delta() { return _delta; }
private:
cmplx _gamma;
double _delta;
}
次に、2 つの異なる Foo 実装を作成します。
class Foo1 : public Foo, public Decorator1
{ }
class Foo2 : public Foo, public Decorator2
{ }
GUIコマンドに従ってそれぞれを使用します。ただし、このような変更はすべてのコードに反映され、 and を使用するクラスごとに 2 つの異なるバージョンを作成する必要がFoo1
ありFoo2
ます (たとえば、 and を作成する必要がFooContainer1
ありますFooContainer2
)。
これを行うより邪魔にならない方法は、作成することです
class Bar: public Foo, public Decorator1, public Decorator2
{ }
の代わりにこれを使用しますFoo
。この場合、必要な関数だけを呼び出して、他の関数はDecorator1
無視Decorator2
しますが、これは優れた OOP 手法に反するようです。
問題に関する提案はありますか?