我创建了一个名为' iDrawableObject'包含对象的所有绘图相关方法/成员。
界面还包括虚拟方法,例如'装饰'其中派生类可以改变它们在屏幕上的显示方式。
我在iDrawableObject接口的构造函数中调用了decorate方法,但是,正如预测的那样,它不会调用重写方法。 这是因为接口的构造函数在派生类的构造函数之前运行,因此该方法尚未被覆盖。
我发现这种困境的替代方法是手动调用被覆盖的装饰'派生类的构造函数中的方法。然而,这对我来说似乎很糟糕,因为它很容易被遗忘,而且它是一种附加的依赖性'可以这么说。
我的问题是:被覆盖的“装饰”的最佳方式是什么?调用派生类的方法,而不强制实现者在每个派生类的构造函数中手动调用它(可以安全地假设所有使用该接口的类都需要调用自己的decorate实现)。
谢谢!
class iDrawableObject {
public:
iDrawableObject()
{
registerWithGameEngine(this);
decorate();
}
~iDrawableObject()
{
}
void draw()
{
... // Draws it on screen
}
virtual void decorate()
{
renderGraphic = SquareGraphic(...);
}
protected:
Graphic renderGraphic;
Vector2f positionOnScreen;
};
class Circle
:
public iDrawableObject;
{
public:
Circle(Vector2f _pos)
:
positionOnScreen(_pos)
{
}
void decorate() override
{
renderGraphic = CircleGraphic(...);
}
};
int main() {
Circle c = Circle(Vector2f(0.0f, 0.0f);
c.draw(); // A Square is drawn on screen
c.decorate(); // Now calls the overriden method
c.draw() // A Circle is drawn on screen
return 0;
}
答案 0 :(得分:1)
我认为基本问题是你有派生类初始化基类的成员。如果将受保护的成员设为私有,并强制派生类将适当的值传递给基类构造函数,则必须正确构造它们。
如果唯一的基类构造函数是
iDrawableObject(Graphic rG, Vector2f pos)
: renderGraphic(rG), positionOnScreen(pos)
{ }
派生类必须提供所需的信息。
此外,在派生类中初始化基类成员,如
Circle(Vector2f _pos)
:
positionOnScreen(_pos) // member of iDrawableObject
{
}
无论如何都不起作用。