在包装API时,我应该避免在实现类中进行向上转换

时间:2013-10-12 16:21:33

标签: c++

我正在编写一些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

1 个答案:

答案 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