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

How would you hand a member of a class implementing an interface to another class using the interface?

我刚刚尝试使用接口和包装 classes,但遇到了障碍。我将 SFML::RenderWindow 包装在实现 draw() 函数的 class 中。例如:

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;
}

换句话说,有没有办法让我传递底层的东西?我缺少的模式?我基本上是想隐藏 windows 和 sprite 实现。最终,我想尝试 'swapping' 实现并降低一点,但如果我无法解决这个问题,我还没有准备好尝试那个。

谢谢!

你为什么不想做演员?在这种情况下它是安全且定义明确的:

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,但您始终应该这样做,因为您不会混合两种不同的图形相同代码中的后端。