0

我正在编写一些 c++ 代码,并希望将 SFML 用于我的 GUI 实现。我没有公开内部类型,而是尝试编写一个纯虚拟 GUI 类,以及一些相关的类,例如用于绘图的 Surface。然后,我在 SFML 中对每个都有我的实现。我的问题出现在 GUI 的 draw(Surface s) 函数需要访问我需要从 Surface 对象访问的 SFML 类型 sf::Texture 的地方。

现在,我知道我的代码中的任何 Surface 都将使用与 GUI 类相同的 API,因为我只有一个实现。我正在尝试编写好的代码,因为这主要是一个学习练习,我相信这会打破Liskov 替换原则

我试图用尽可能简单的代码来概述我的问题:

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

4

1 回答 1

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;

};

这个想法是返回类型不需要相同,只要它 与原始返回类型是协变的

于 2013-10-12T17:01:21.790 回答