在包装API时,我是否应该避免在实现类中向上转换 我写了一些C++代码,希望用SfML来实现我的GUI。 我没有公开内部类型,而是尝试编写一个纯虚拟GUI类,以及一些相关类,例如用于绘图的曲面。然后,我在SFML中为每一个都提供了实现。 我的问题在于GUI的draw(Surface s)函数需要访问SFML类型sf::Texture,我需要从我的Surface对象访问该类型
现在,我知道我的代码中的任何表面都将使用与GUI类相同的API,因为我只有一个实现。我正在努力编写好的代码,因为这主要是一个学习练习,我相信这将打破传统 我试图用尽可能简单的代码概述我的问题,如下所示:在包装API时,我是否应该避免在实现类中向上转换 我写了一些C++代码,希望用SfML来实现我的GUI。 我没有公开内部类型,而是尝试编写一个纯虚拟GUI类,以及一些相关类,例如用于绘图的曲面。然后,我在SFML中为每一个都提供了实现。 我的问题在于GUI的draw(Surface s)函数需要访问SFML类型sf::Texture,我需要从我的Surface对象访问该类型,c++,C++,现在,我知道我的代码中的任何表面都将使用与GUI类相同的API,因为我只有一个实现。我正在努力编写好的代码,因为这主要是一个学习练习,我相信这将打破传统 我试图用尽可能简单的代码概述我的问题,如下所示: class Surface { // ... }; class SFML_Surface : public Surface { public: sf::Texture* get_texture() { return _surface->getTexture();
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());
}
};
类曲面{
// ...
};
类SFML_曲面:公共曲面{
公众:
sf::纹理*获取纹理(){
返回_surface->getTexture();
}
// ...
私人:
sf::RenderTexture*_曲面;
};
类GUI{
公众:
虚拟空心渲染(曲面*s)=0;
// ...
};
类SFML_GUI:公共GUI{
公众:
无效渲染(曲面*s){
SFML_表面*表面=静态_铸件;
如果(曲面==0)
返回;
此->_窗口->渲染(曲面->getTexture());
}
};
我有点不知所措,不知该怎么办,我想不出一个明显的方法来解决类间的依赖关系,而不在某些部分进行转换
如果您对以上代码有任何想法,或者对其他方法进行讨论,我将不胜感激。或者,正如标题所问,在这种特定情况下,向上投射是一个坏主意吗
提前谢谢
代码编辑:动态\u转换应该是静态\u转换
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;
};
想法是返回类型不需要相同,只要它是一样的。您可以将
get_texture()
作为虚拟函数添加到类表面
,对吗?问题是,它必须返回指向特定于实现的sf::texture的指针。如果我返回一个空指针,我仍然需要转换它。首先告诉我们为什么s->render()
不能工作。对不起,你的意思是让曲面执行渲染调用吗?是的,完全正确。这是教科书中的OOP示例。这看起来像我想的,我没有意识到协变返回类型。谢谢协变返回类型在这里有什么帮助?