我正在编写一些c ++代码,并希望将SFML用于我的GUI实现。 我试图编写一个纯虚拟GUI类,以及一些相关的类,而不是暴露内部类型,例如Surface for drawing to。然后我在SFML中为每个实现了我的实现。 我的问题出现在GUI的绘图(Surface s)函数需要访问我需要从Surface对象访问的SFML类型sf :: Texture。
现在,我知道我的代码中的任何Surface都将使用与GUI类相同的API,因为我只有一个实现。我我试图编写好的代码,因为这主要是一个学习练习,我相信这会破坏Liskov substitution principle。
我试图用下面的简单代码概述我的问题:
class Surface {
// ...
};
class SFML_Surface : public Surface {
public:
sf::Texture* get_texture() {
return _surface->getTexture();
}
// ...
private:
sf::RenderTexture* _surface;
};
class GUI {
public:
virtual void render(Surface *s) = 0;
// ...
};
class SFML_GUI : public GUI {
public:
void render(Surface *s) {
SFML_Surface *surface = static_cast<SFML_Surface*>(s);
if(surface == 0)
return;
this->_window->render(surface->getTexture());
}
};
关于从哪里开始,我有点不知所措,我想不出一种明显的方法来解决类内依赖关系,而不需要在某些部分进行强制转换。
我对以上代码的任何想法或对替代方法的讨论表示感谢。或者,正如标题所要求的那样,在这种特定情况下正在向上倾斜一个坏主意?
提前致谢。
代码编辑:dynamic_cast应该是static_cast
答案 0 :(得分:1)
class Surface {
// ...
virtual TextureBase* get_texture() = 0;
};
class SFML_Surface : public Surface {
public:
sf::Texture* get_texture() { // define sf::Texture to inherit from Texture Base
return _surface->getTexture();
}
// ...
private:
sf::RenderTexture* _surface;
};
想法是返回类型不必相同,只要它是covariant with the original return type。