ООП дизайн: Как определить поток программы и класс, ответственный за метод (библиотека JSFML)

Я разрабатываю 2D-игру для практики Java и объектно-ориентированного программирования (я использую библиотеку JSFML, если это поможет), и у меня есть сомнения относительно того, как лучше спроектировать следующее:

Библиотека, которую я использую, предлагает Drawable Интерфейс реализован видимыми элементами игры (игрок, враги, фоны и т. д.). у меня тоже есть RenderWindow на котором я нарисую Drawable объекты.

Вот в чем дело, RenderWindow имеет draw(Drawable d) метод, который рисует Drawable объект в текущем окне, а Drawable объекты имеют draw(RenderWindow r) метод, который рисует ток Drawable объект на RenderWindow прошло.

Если они делают в основном одно и то же, какую мне использовать? Зачем? Что я должен принять во внимание, чтобы решить? Я использую HashMap для хранения Drawable объекты. Должен ли я пройти RenderWindow к Drawables в HashMap или передать Drawables в HashMap к RenderWindow? Любой совет приветствуется.

1 ответ

Решение

Однострочный ответ на ваш вопрос будет
Язык Java не поддерживает механизм двойной отправки.

Что делать: библиотека ожидает, что вы переопределите эти методы, но никогда не будете их вызывать. Я не использовал библиотеку, но из некоторого опыта работы с игровыми движками, я думаю, приложение будет вызывать отрисовку RenderWindow и в конечном итоге будет вызывать все методы отрисовки Drawable. (Коллекция Drawables будет поддерживаться RenderWindow.

Почему: Java динамически вызывает метод, проверяя класс объекта, для которого вызывается метод (не проверяя ссылку). Это называется (как вы, наверное, знаете) динамической отправкой.
Но аргументы метода выбираются только проверкой ссылки (а не классом фактического объекта, переданного в качестве аргумента).
Здесь, принудительно выполнив динамическую диспетчеризацию дважды (создав два метода для одной и той же цели), разработчики библиотеки косвенно реализовали двойную диспетчеризацию.

В будущем вы можете расширить как Drawable, так и RenderWindow. Если у вас был метод рисования только в Drawable, вы не можете иметь отдельное рисование для каждого дочернего элемента RenderWindow. Двойная отправка решает эту проблему.

Надеюсь это поможет.

Другие вопросы по тегам