如何将一个实现接口的类的成员交给另一个使用接口的类?

问题描述 投票:1回答:1

我刚刚在试验接口和包装类,我遇到了一个障碍。 我正在将一个SFML::RenderWindow包装在一个实现draw()函数的类中。 例如,我在一个实现了draw()函数的类中封装了一个SFML::RenderWindow。

struct ISprite {
    ....
    functions for sprites...
    ....
}

class SFML_Sprite : public ISprite
{
public:
    ....
    functions implementing stuff for sprites
    ....

private:
    sf::Sprite mSprite;

} 

struct IWindow {
    ...
    virtual void draw(const ISprite& sprite) = 0;
    ...
}

class SFML_Window : public IWindow
{
public:
    ...
    void draw(const ISprite& sprite)
    {
         //This is where the problem is.  Is there a way for me to get to
         //mSprite? 
         mWin.draw(sprite.mSprite);
    }
private:
    sf::RenderWindow mWin;
}

换句话说,有没有办法让我把底层的东西传递出去? 我错过了一个模式? 我基本上是想隐藏窗口和精灵的实现。 最终,我想尝试 "交换 "实现,再低一点级别,但如果我不能解决这个问题,我还没有准备好去尝试。

谢谢!

c++ inheritance interface encapsulation
1个回答
0
投票

为什么你不想做投射?在这种情况下,它是安全的,而且定义得很好。

class ISprite {
};

class SFML_Sprite : public ISprite
{
};

class IWindow {
public:
    virtual void draw(const ISprite& sprite) = 0;
};

class SFML_Window : public IWindow
{
public:
    void draw(const ISprite& _sprite)
    {
       auto sprite = static_cast<const SFML_Sprite&>(_sprite);
    }
};

int main() {
   SFML_Window i;
   IWindow &a = i;

   SFML_Sprite x;
   ISprite &y = x;

   a.draw(y);
   return 0;
}

如果你想花钱进行运行时检查以确保你得到的是正确的类型,你可以使用dynamic_cast,但你总是应该这样做,因为你不会在同一代码中混合两个不同的图形后端。

© www.soinside.com 2019 - 2024. All rights reserved.