在包装API时,我是否应该避免在实现类中向上转换 我写了一些C++代码,希望用SfML来实现我的GUI。 我没有公开内部类型,而是尝试编写一个纯虚拟GUI类,以及一些相关类,例如用于绘图的曲面。然后,我在SFML中为每一个都提供了实现。 我的问题在于GUI的draw(Surface s)函数需要访问SFML类型sf::Texture,我需要从我的Surface对象访问该类型

在包装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();

现在,我知道我的代码中的任何表面都将使用与GUI类相同的API,因为我只有一个实现。我正在努力编写好的代码,因为这主要是一个学习练习,我相信这将打破传统

我试图用尽可能简单的代码概述我的问题,如下所示:

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示例。这看起来像我想的,我没有意识到协变返回类型。谢谢协变返回类型在这里有什么帮助?