Суперкласс и подкласс Java

У меня есть суперкласс под названием «BossCraft», который включает в себя метод void, помеченный как «перемещение». У меня также есть класс, который расширяет BossCraft, называется SharkBoss, у которого также есть метод void «перемещения».

Можно ли как-то вызвать метод "перемещения" SharkBoss в вышестоящий метод BossCraft?

public class BossCraft
{
   public void move
   {
      //SharkBoss's move should go here
   }
}
public class SharkBoss extends BossCraft
{
   public void move
   {
      ...
   }
}

person Community    schedule 17.11.2011    source источник
comment
Ааа, что вы подразумеваете под «Можно ли каким-то образом вызвать метод перемещения SharkBoss в более высокий метод BossCraft?» Идея наследования заключается в том, что вы можете определить весь код для перемещения в BossCraft, затем вы можете вызвать SharkBoss.move(), и он запустит код перемещения из BossCraft, вы это имеете в виду?   -  person dann.dev    schedule 18.11.2011


Ответы (6)


Да, super.move() (super. означает вызов (метода) суперкласса)

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

Обратите внимание, что ваши определения синтаксически неверны - у вас должны быть скобки - move()

person Bozho    schedule 17.11.2011
comment
Я думаю, он пытается сделать наоборот. - person Bhesh Gurung; 18.11.2011
comment
возможно.. но ему следует улучшить свое предложение, оно может означать и то, и другое (и на самом деле ничего не значит прямо сейчас :) ). Я все равно добавил предложение об этом - person Bozho; 18.11.2011
comment
если он хочет сделать это в обратном порядке, он мог бы использовать это в абстрактном классе (и, возможно, немного переписать код)? - person Jan Vorcak; 18.11.2011
comment
да. Но это зависит от того, что он хочет делать. Я ответил на вопрос, который сразу понял :) - person Bozho; 18.11.2011

использовать

super.move();

Он вызовет функцию move() своего родителя (т. е. своего суперкласса-экземпляра)!

person Willem Mulder    schedule 17.11.2011

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

person Jan Vorcak    schedule 17.11.2011

Да:

BossCraft craft = new SharkBoss();
// Actually calls SharkBoss.nove
craft.move();
person OldCurmudgeon    schedule 17.11.2011

Вы не должны этого делать. Весь смысл наследования в том, что SharkBoss всегда BossCraft, но BossCraft может быть SharkBoss, а может и не быть. Методы на корабле SharkBoss должны быть применимы только к SharkBoss.

Если вы вызовете «перемещение» для SharkBoss, то движение SharkBoss будет вызвано без каких-либо действий.

person DJClayworth    schedule 17.11.2011

Вы можете просто привести к SharkBoss в методе перемещения суперкласса:

public class BossCraft {
   public void move(){
       //SharkBoss's move should go here
   SharkBoss s = (SharkBoss) this;
   s.move();
   }
}

Однако сам принцип использования подклассов заключается в том, что это должны быть односторонние отношения, суперклассы не должны знать о своих подклассах. Я бы посоветовал вам провести рефакторинг.

person Scherrer Vincent    schedule 17.11.2011
comment
Это все равно не сработает. Приведение не изменяет тип объекта, оно просто позволяет компилировать код. Этот код закончился бы StackOverflow: D - person OldCurmudgeon; 18.11.2011