我想知道您将如何解决这样的问题:
我有一堂课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。我可以通过创建两个这样的“装饰器”来解决这个问题:
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;
}
然后我会创建两个不同的 Foo 实现:
class Foo1 : public Foo, public Decorator1
{ }
class Foo2 : public Foo, public Decorator2
{ }
并根据 GUI 命令使用每一个。然而,这样的更改会传播到我的所有代码中,并会迫使我为每个使用Foo1
and的类创建两个不同的版本Foo2
(例如,我必须创建FooContainer1
and FooContainer2
)。
一种不那么侵入性的方法是创建
class Bar: public Foo, public Decorator1, public Decorator2
{ }
并使用它而不是Foo
. 在这种情况下,我只会调用我需要的函数Decorator1
并Decorator2
忽略其他函数,但这似乎与良好的 OOP 技术背道而驰。
关于这个问题的任何建议?