2017-02-02 6 views
0

オブジェクトのすべての描画関連メソッド/メンバーを含む '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; 
} 

答えて

1

基本的な問題は、クラスを派生させて基本クラスのメンバーを初期化したことだと思います。保護されたメンバーを非公開にし、派生したクラスが基本クラスのコンストラクターに適切な値を渡すようにすると、それらは適切に構成されなければなりません。

のみ、基本クラスのコンストラクタは、派生クラスで必要な情報を提供しなければならない

iDrawableObject(Graphic rG, Vector2f pos) 
    : renderGraphic(rG), positionOnScreen(pos) 
{ } 

ある場合。また

Circle(Vector2f _pos) 
    : 
    positionOnScreen(_pos) // member of iDrawableObject 
{  
} 

はとにかく動作しないように、派生クラスで基本クラスのメンバを初期化します。

+0

私は事を明確にするのに役立つBo Perssonに感謝します。 私は可能な限りきれいにしてコンストラクタを保持したいので、この方法を避けていました(いくつかのクラスではかなりの「装飾」呼び出しがあるためですが、それはきれいに行う唯一の真の方法だと思います。 –

関連する問題