【发布时间】:2017-02-02 10:32:06
【问题描述】:
我创建了一个名为“iDrawableObject”的接口,其中包含一个对象的所有与绘图相关的方法/成员。
该接口还包括虚拟方法,例如“装饰”,派生类可以在其中更改它们在屏幕上的显示方式。
我在 iDrawableObject 接口的构造函数中调用了 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;
}
【问题讨论】:
标签: c++ inheritance