继承链,子类不是覆盖方法

我正在编写一个带有对象的游戏,我想根据它的类使用不同的命令。我有一个超类“项目”、一个子类“工具扩展项目”和“锤子扩展工具”。在 Item 超类(它是抽象的)中,我有一个抽象方法“doCommand”,我在 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;

    }

}

我希望它打印“覆盖”。但我得到“没有被覆盖。”。


慕妹3146593
浏览 160回答 2
2回答

呼啦一阵风

这取决于您如何调用 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() );希望这可以帮助。

侃侃尔雅

你应该得到“覆盖”。应该始终执行的一项完整性检查是添加@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 的混淆。(顺便说一句,多类继承是另一个概念,这里不要混淆。)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java