我正在编写一个游戏,该游戏中的对象要根据其类使用不同的命令。我有一个超类“物品”,一个子类“工具扩展了物品”和“悍马扩展了工具”。在Item超类(抽象的)中,我有一个抽象方法'doCommand',该方法在Tool中被覆盖。这很好用,我现在在Tool中有一个正常的'doCommand'。但是,当我想在Hammer中覆盖此“ doCommand”时,它仅使用工具的“ 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;
}
}
我希望它打印“已覆盖”。但我收到“未覆盖”。
答案 0 :(得分:0)
这取决于您如何调用doCommand函数。
如果您这样调用doCommand():
Hammer hammer = new Hammer();
hammer.doCommand("", hammer, new Player());
OR
Item item = new Hammer();
item.doCommand("", item ,new Player());
它将打印“已覆盖”。只要您初始化为New Hammer()。它将被覆盖。
但是下面将显示“未覆盖”
Item item = new Tool();
item.doCommand("", item, new Player() );
希望这会有所帮助。
答案 1 :(得分:0)
您应该获得“覆盖”。 始终要做的一项完整性检查是添加@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混合在一起。
(顺便说一下,多重类继承是另一个概念,在这里不要混淆。)