【问题标题】:Calling overridden interface method in interface constructor在接口构造函数中调用重写的接口方法
【发布时间】: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


    【解决方案1】:

    我认为基本问题是派生类初始化基类的成员。如果您将受保护的成员设为私有,并强制派生类将正确的值传递给基类构造函数,则它们必须正确构造自己。

    如果唯一的基类构造函数是

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

    派生类必须提供所需的信息。

    另外,在派生类中初始化基类成员,比如

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

    不管用。

    【讨论】:

    • 感谢 Bo Persson,这有助于我澄清事情。我避免这样做是因为我想让构造函数尽可能整洁(因为在某些类中有重要的“装饰”调用。但我认为这是唯一真正做到整洁的方法。
    猜你喜欢
    • 2019-02-01
    • 1970-01-01
    • 2012-10-14
    • 2011-02-17
    • 2019-03-03
    • 1970-01-01
    • 2010-12-13
    • 1970-01-01
    • 2023-03-06
    相关资源
    最近更新 更多