【问题标题】:Inheritance-chain, sub-class is not overriding method继承链,子类不是覆盖方法
【发布时间】:2019-02-06 15:09:04
【问题描述】:

我正在编写一个包含对象的游戏,我想根据它的类使用不同的命令。我有一个超类“项目”、一个子类“工具扩展项目”和“锤子扩展工具”。在 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;
    }
}

我希望它打印“已覆盖”。但我得到“未覆盖。”。

【问题讨论】:

  • 你怎么打电话?
  • 你能粘贴你的主类的代码吗?还是您从中调用函数 doCommand 的代码?
  • 我更新了它,但不确定这是你要找的。​​span>
  • 你可能想让你的Tool 类抽象,因为这很可能是问题所在。你在某个地方实例化了一个Tool(可能因为它不是抽象的),循环它,因此实际上是在调用doCommand() of Tool

标签: java inheritance abstract


【解决方案1】:

你应该得到“覆盖。”。应该始终执行的一项完整性检查是添加@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 的混淆。

(顺便说一下,多类继承是另一个概念,这里不要混淆。)

【讨论】:

    【解决方案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() );
    

    希望这会有所帮助。

    【讨论】:

    • 感谢您的回答。这不完全是解决方案,但它让我思考并找到了它。干杯!
    • @Win Han 我对您的答案进行了编辑,您在所有 3 个案例中都通过了 new Item()
    • @dirtydazzel 这是一个不仅是您,还有其他人可以参考您的问题和答案以及 cmets 的地方。如果它让您思考,请不要将答案标记为已接受。如果您自己找到了答案,您可以投票给一个没有回答您的问题但让您思考正确方向的答案。 添加您找到的正确答案并将其标记为已接受。这将防止其他人被误导
    猜你喜欢
    • 2012-11-20
    • 1970-01-01
    • 2012-05-08
    • 2014-01-15
    • 2012-09-27
    • 1970-01-01
    • 2021-05-04
    • 2016-01-24
    • 1970-01-01
    相关资源
    最近更新 更多