我刚刚在试验接口和包装类,我遇到了一个障碍。 我正在将一个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;
}
换句话说,有没有办法让我把底层的东西传递出去? 我错过了一个模式? 我基本上是想隐藏窗口和精灵的实现。 最终,我想尝试 "交换 "实现,再低一点级别,但如果我不能解决这个问题,我还没有准备好去尝试。
谢谢!
为什么你不想做投射?在这种情况下,它是安全的,而且定义得很好。
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,但你总是应该这样做,因为你不会在同一代码中混合两个不同的图形后端。