Должен ли я избегать перенаправления в классах реализации при переносе API

0

Я пишу код c++ и хочу использовать SFML для моей реализации графического интерфейса. Вместо того, чтобы разоблачать внутренние типы, я пытаюсь написать чистый виртуальный GUI-класс, а также некоторые связанные классы, например, Surface для рисования. Затем у меня есть свои реализации для каждого в SFML. Моя проблема возникает, когда функция рисования графического интерфейса (Surface s) требует доступа к SFML-типу sf :: Texture, который мне нужен для доступа к моему объекту Surface.

Теперь я знаю, что любая Surface в моем коде будет использовать тот же API, что и GUI-класс, поскольку у меня есть только одна реализация. Я пытаюсь написать хороший код, поскольку это прежде всего учебное упражнение, и я считаю, что это нарушит принцип замещения Лискова.

Я попытался описать свою проблему как простой код, как я могу ниже:

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 ответ

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;

};

Идея типа возврата не обязательно должна быть одинаковой, если она ковариантна с исходным типом возврата.

  • 0
    Это похоже на то, что я имел в виду, я не понимал о ковариантных типах возвращаемых данных. Спасибо!
  • 0
    Как именно ковариантные типы возвращаемых данных помогают здесь?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню