继承链,子类不是重写方法

时间:2019-02-06 15:09:05

标签: java inheritance abstract

我正在编写一个游戏,该游戏中的对象要根据其类使用不同的命令。我有一个超类“物品”,一个子类“工具扩展了物品”和“悍马扩展了工具”。在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;
    }
}

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

2 个答案:

答案 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混合在一起。

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