Вызов метода в подклассе с доступом к его суперклассу - PullRequest
1 голос
/ 14 марта 2012

Я делаю футбольную игру для Android.

У меня есть класс Player.Плеер расширяется за счет DefencivePlayer и OffensivePlayer.В каждом из этих классов реализовано сенсорное событие, и все они уникальны.У меня есть другой класс, движитель, который обрабатывает прикосновения, которые имеют доступ к игроку.(как показано ниже)

FootballGameUML

Игрок всегда является либо DefencivePlayer, либо OffensivePlayer.Мне бы хотелось, чтобы была возможность обрабатывать касания простым вызовом Player.touch, и, в зависимости от того, какой бы он ни был, соответствующий метод касания будет вызываться в DefencivePlayer или OffensivePlayer.

Я считаю, что мой дизайндва класса расширяют класс Player, потому что он не гарантирует наличие подклассов.

Пожалуйста, помогите, я действительно пытаюсь получить хороший дизайн и не хочу ничего взламывать.

Ответы [ 3 ]

2 голосов
/ 14 марта 2012

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

0 голосов
/ 14 марта 2012

Можно сделать Player.Touch() abstract.Это гарантирует, что подклассы будут обеспечивать свою собственную реализацию.

0 голосов
/ 14 марта 2012

Я не уверен, правильно ли я понимаю ваш вопрос, но, похоже, с вашей текущей настройкой все в порядке.

Пока метод Touch() равен abstract (при этом Player будет объявлен как abstract class Player), или Player определен как interface Player, вы сможете использовать player.Touch() и убедиться, что реализованный метод называется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...