Я делаю футбольную игру для Android.
У меня есть класс Player. Игрок распространяется на DefencivePlayer и OffensivePlayer. Каждый из этих классов имеет сенсорное событие, и все они уникальны. У меня есть другой класс, движитель, который обрабатывает касания, имеющие доступ к Player. (как видно ниже)
Игрок всегда либо DefencivePlayer, либо OffensivePlayer. Я бы хотел, чтобы функциональность была способна обрабатывать штрихи, просто вызвав Player.touch и, в зависимости от того, какой именно метод касания будет вызван в DefencivePlayer или OffensivePlayer.
Я считаю, что мой дизайн с двумя классами расширяет класс Player неправильно, потому что он не гарантирует наличие подклассов.
Пожалуйста, помогите, я действительно пытаюсь получить хороший дизайн здесь и не хочу ничего взломать.
Я сделал быстрый тест - используя диаграмму классов, я создал три класса игроков и создал общий список ArrayList<Player>
для Нападающих и Оборонительных игроков. Распечатайте результаты этого кода:
players.add(new OffensivePlayer());
players.add(new DefensivePlayer());
players.add(new OffensivePlayer());
players.add(new OffensivePlayer());
players.add(new DefensivePlayer());
for(Player p: players)
p.touch();
дал мне этот результат:
Touched offensive player.
Touched defensive player.
Touched offensive player.
Touched offensive player.
Touched defensive player.
Другими словами, различные типы игроков были интерпретированы как подклассы, а не только как экземпляр Player
.
С точки зрения дизайна было бы целесообразно сделать Player
абстрактным классом, тем самым гарантируя, что не создаются объекты простого Player
, поэтому метод touch()
будет выполняться только из экземпляра подкласса Player
.
Вы можете сделать Player.Touch()
abstract
. Это обеспечит, чтобы подклассы предоставили свою собственную реализацию.
Я не уверен, правильно ли понимаю ваш вопрос, но, похоже, в вашей текущей настройке нет ничего плохого.
Пока метод Touch()
является abstract
(что делает Player
объявленным как abstract class Player
), или Player определяется как interface Player
, вы сможете использовать player.Touch()
и убедиться, что вызванный метод вызван.