我正在开发一个系统,其中我有可以按层次顺序堆叠的矩形。所以基地是这样的:
Rect parent;
Rect child;
parent.addChild(&child);
...
Rect* someChild = parent.getChildAt(1);
到目前为止很容易实现。但是这些矩形应该能够实现不同的功能。这可能是序列化器、样式器、抽屉等...
现在我知道多重继承是一种“不行”,但在这种情况下,我会发现这样的语法是可取的:
class StackableStyleableRect: publicRect, public Stackable, Styleable{}
class StackableStyleableDrawableRect: public Rect, public Stackable, Styleable, Drawable{}
我偶然发现了奇怪的反复出现的模板模式(crtp),如果我理解正确的话,这将使上述成为可能。像这样的东西:
class Rect{
public:
float width;
float height;
}
template <class RectType>
class Stackable{
public:
void addChild(RectType* c){
children.push_back(c);
}
std::vector<RectType*> children;
}
template <class RectType>
class Drawable{
public:
virtual void draw(){
RectType* r static_cast<RectType>(this);
drawRect(r->width, r->height);
}
}
template <class RectType>
class Styleable{
public:
int r, g, b;
}
class CustomRect: public Rect, public Stackable<CustomRect>, public Drawable<CustomRect>{
}
class CustomRectWithStyle: public Rect, public Stackable<CustomRect>, public Drawable<CustomRect>, public Styleable<CustomRect>{
public:
}
这样做的原因是我想重用具有不同类型 Rect 类型的代码。在一个项目中,我不必为它们设置样式,而在另一种情况下,我需要提供的所有功能。通过这种方式来选择所需的功能,它可以保持清洁并分离功能。
我对此进行了一些基本测试,它按预期工作,但我觉得随着时间的推移语法可能会变得过于复杂。
同样在某些时候,使组件相互依赖或在组件存在时使它们的行为不同会很有用。(例如 Drawable 的绘图功能可以自动使用 Styleable 中的颜色(如果存在))
现在我注定迟早会遇到麻烦,还是它会起作用?有没有更适合的不同模式?还是根本不可能在“正确的”c ++中做这样的事情?