Как вызвать методы определенных классов (наследование) - PullRequest
0 голосов
/ 27 марта 2012

Я пишу небольшую Java-игру, в которой есть различные типы монстров, пара управляемых компьютером игроков и человек-контролируемый игрок.Игровой мир представляет собой довольно простую 2D сетку.Сетка объявлена ​​так, что она ожидает гуманоидных объектов.То есть Humanoid [][] grid.Тем не менее, различные части гуманоидного кода должны быть переопределены для каждого типа символов.

У меня возникли некоторые проблемы с тем, как я могу назвать метод перемещения, специфичный для человека, если код ожидает гуманоидов, а также как проверитьграницы для движения.

Если что-то неясно, дайте мне знать.

Спасибо

Примечание: у моего гуманоидного класса нет метода перемещения, и из-за того, чточто я делаю это для класса, он не может либо

Ответы [ 3 ]

1 голос
/ 27 марта 2012

Вам не нужно ничего делать.Если у вас есть класс Humanoid с методом move и класс Human, который расширяется от Humanoid, со своим собственным методом move, при вызове move будет использоваться версия человека (еслиВы вызываете его для экземпляра Human).

Поэтому, если вы выполните

Humanoid human = new Human();
human.move();  // Human's move is invoked

Humanoid orc = new Orc();
orc.move(); // Orc's move is invoked

, среда выполнения автоматически вызовет соответствующий метод перемещения.

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

Смысл наследования в том, что вам не нужно знать, в каком подклассе вы работаете. Например, скажем, что и люди, и монстры имели общий класс «Мобильный», а у Мобильного был абстрактный метод «движение». Люди могут отвергать движение, чтобы пройтись по карте, птицы могут отвергать ее, чтобы летать, а наземные акулы могут плавать под землей.

Дело в том, что ваша карта просто вызывает Mobile.move (), и действие будет делегировано фактическому подклассу для выполнения перемещения.

Если вам нужно знать, какой класс вы используете, вы делаете это неправильно - однако иногда вам нужно что-то знать о классе, например, если местность непроходима, тогда вы можете вызвать Mobile.canFly () чтобы увидеть, поддерживает ли данный зверь полет.

Позже, если вы решите, что люди могут летать с помощью заклинаний, вы просто изменяете класс людей, и все остальное просто работает, но если вы проверили класс и позволили "Стервятнику", "Орлу" и "Дракону" летать над препятствие, тогда ваш код будет намного сложнее исправить, если вы измените его или добавите к нему.

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

Если вы переопределяете методы в подклассах, вам не нужно делать ничего особенного, чтобы вызывать их.Просто вызовите метод для вашей переменной Humanoid, и каким бы ни был фактический класс экземпляра, это версия метода, который будет выполняться.

Возможно, вы захотите сделать Humanoid абстрактный класс с абстрактнымметоды, которые должны быть определены в подклассах, или, может быть, даже интерфейс.Но это будет работать, даже если вы определите метод с кодом в Humanoid, а затем переопределите этот же метод другим кодом в подклассе.Версия метода подкласса будет работать, когда объект, к которому вы вызываете его, является экземпляром подкласса, даже если ваша переменная имеет тип Humanoid, а не подкласс.

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