Цепочка наследования, подкласс не переопределяющий метод - PullRequest
0 голосов
/ 06 февраля 2019

Я пишу игру с объектами, в которых я хочу использовать разные команды в зависимости от класса.У меня есть суперкласс «Предмет», подкласс «Инструмент расширяет Предмет» и «Молот расширяет Инструмент».В суперклассе Item (который является абстрактным) у меня есть абстрактный метод doCommand, который я переопределяю в Tool.Это хорошо работает, и теперь у меня есть рабочий doCommand в Tool.Но когда я хочу переопределить этот doCommand в Hammer, он просто использует инструмент doCommand.

public abstract class Item {
    public abstract void doCommand(String com1, Item i, Player player);
}

public class Tool extends Item {
    public void doCommand(String com, Item i, Player player) {    
         System.out.println("Not overridden.");    
    }
}

public class Hammer extends Tool {
    public void doCommand(String com, Item i, Player player) {    
         System.out.println("Overridden.");    
    }
}

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

String parts[] = com.split(" ");
String com1 = parts[0];
String com2 = parts[1];
for (Item i : player.getItems()) {
    if (com2.toUpperCase().equals(i.getName().toUpperCase())) {
        i.doCommand(com1, i, player);
        break;
    }
}

Я ожидаю, что он напечатает «Переопределено».но я получаю "Не переопределено".

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Ты должен был получить "Переопределение".Одна проверка целостности, которую следует всегда делать, - это добавить @Override, чтобы убедиться, что в подписи нет опечаток и что-то действительно переопределено.

public abstract class Item {
    public abstract void doCommand(String com1, Item i, Player player);
}

public class Tool extends Item {
    @Override
    public void doCommand(String com, Item i, Player player) {    
         System.out.println("Not overridden.");    
    }
}

public class Hammer extends Tool {
    @Override
    public void doCommand(String com, Item i, Player player) {    
         System.out.println("Overridden.");    
    }
}

Item item = new Hammer();
item.doCommand("", null, null); // "Overriden."

Вероятная причина для МоисеяВаша ошибка - это смешивание параметра doCommand Item и Item в списке.

(Кстати, наследование нескольких классов - это еще одна концепция, не путать ее здесь.)

0 голосов
/ 06 февраля 2019

Это зависит от того, как вы вызываете функцию doCommand.

Если вы вызываете doCommand () следующим образом:

 Hammer hammer = new Hammer();
 hammer.doCommand("", hammer, new Player());

ИЛИ

Item item = new Hammer();
 item.doCommand("",  item ,new Player());

Будет напечатано "Переопределена».Пока вы инициализируете как New Hammer ().оно будет переопределено.

Но ниже будет напечатано "не переопределено"

 Item item = new Tool();
 item.doCommand("", item, new Player() );

Надеюсь, это поможет.

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