您如何将实现接口的 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,但您始终应该这样做,因为您不会混合两种不同的图形相同代码中的后端。
我刚刚尝试使用接口和包装 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,但您始终应该这样做,因为您不会混合两种不同的图形相同代码中的后端。