オブジェクトのすべての描画関連メソッド/メンバーを含む '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;
}
私は事を明確にするのに役立つBo Perssonに感謝します。 私は可能な限りきれいにしてコンストラクタを保持したいので、この方法を避けていました(いくつかのクラスではかなりの「装飾」呼び出しがあるためですが、それはきれいに行う唯一の真の方法だと思います。 –