В игре на основе спрайтов, которую я пишу, каждое поле в 2D-сетке содержит стек спрайтов.В основном считается верхний.
В модуле правил игры у меня много такого кода:
public boolean isGameWon(Board board) {
for (Point point : board.getTargetPoints())
if(!(board.getTopSpriteAt(point) instanceof Box))
return false;
return true;
}
Обновление: //Do something
считается, если есть Box
сверху каждого Target
.Я не понимаю, как это можно сделать, просто добавив doSomething()
в Sprite, если только doSomething()
не вернет 1, если спрайт является блоком, и 0 в противном случае.(и это было бы точно так же, как instanceof).
Я знаю, instanceof считается вредным, поскольку он убивает идею объектно-ориентированного программирования.
Однако я не уверен, какисправить код в моем случае.Вот некоторые мысли, которые у меня были:
- Не думаю, что будет проще добавить метод
isABox()
в интерфейс Sprite
. - Будетэто поможет, если
Box
был интерфейсом, чтобы другие классы могли получить ту же привилегию? - Должен ли я попытаться сделать что-то необычное, например сопоставление с шаблоном / двойную диспетчеризацию, с шаблонами, подобными посетителю? *
- Это нормально, что модуль правил работает тесно с типами, просто потому, что он все равно должен знать их семантику?
- Является ли вся идея шаблона стратегии модуля правил некорректной?
- Это не такНе имеет смысла встраивать правила в спрайтов, так как тогда все они должны быть изменены при добавлении нового типа.
Я надеюсь, что вы пробовали что-то подобное и можете указать мнев правильном направлении.