Я пишу код 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
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;
};
Идея типа возврата не обязательно должна быть одинаковой, если она ковариантна с исходным типом возврата.