当前位置: 首页 > 知识库问答 >
问题:

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

长孙翔
2023-03-14

我正在编写一个带有对象的游戏,我想根据它的类使用不同的命令。我有一个超级类“项目”,一个子类“工具扩展项目”和“锤子扩展工具”。在项目超类(抽象)中,我有一个抽象方法“doCommand”,我在工具中覆盖了它。这很好用,我现在在工具中有一个有效的“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个答案

任绪
2023-03-14

这取决于您如何调用do命令函数。

如果你像这样调用 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() );

希望这有帮助。

经兴安
2023-03-14

你应该得到“超越”。一个应该经常做的完整性检查是添加<code>@Override</code>,以验证签名中是否存在错别字,并且确实有什么东西被覆盖了。

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参数项和列表中的项混淆。

(对了,多类继承是另一个概念,这里不要混淆。)

 类似资料:
  • 问题内容: 我有两个课,和。它们看起来像这样: 此错误指向Field的: 我希望首先调用Background init ()。要将“ a,b”传递给Fields的 init (),Field会分配a和b,然后将其中包含三个0的列表分配给field。然后让Background的 init ()继续,然后调用它自己的buildField()并用包含c的列表覆盖self.field。 似乎我还没有完全理

  • 如何/可以重写来自非继承类的方法?其次,有没有比“非继承类”更好的术语? 我有一个“扩展”JFrame的类,需要从JPanel重写paintComponent。怎么做?或者它可以扩展JPanel,并需要访问方法,如setTitle()、setResizable()和setDefaultCloseOperation();

  • 问题内容: 我的课是: 我在这个类中写一个子类: 注意在 覆盖类中 的 getX 方法时,我已经从方法定义中删除了该子句,现在它导致编译器出现异常行为,这是预期的: 不会如预期那样将其封闭在一个块中而无法编译。 编译而不将它封闭在一个块中。 但是下面的代码行需要try-catch块。 就像可以预见的那样,即在运行时多态期间使用父类引用来调用子方法,为什么Java的设计人员在覆盖特定的父类方法时没有

  • “编写一个名为clsWorker的超类和子类clsHourlyWorker和clssalariedworker。每个工人都有一个名字和一个工资率。编写计算每个员工周薪的方法computePay(int hours)。小时工按实际工作小时数获得小时工资,如果小时数最多为40小时。如果小时工工作超过40小时,则按时间半支付超出部分。受薪工人得到40小时的小时工资,无论实际小时数是多少。为继承编写一个测

  • 我创建了一个(个人、学生、员工、教职员工)类。Person必须将Student和Employee分为子类。Employee有两个子类:教员和职员。我已经完成了所有的编码,他们工作得很好,除了我的驱动程序类TestPerson程序给出了编译错误 注:一个测试程序,创建一个人、学生、员工、教职员工,并调用他们的toString方法。 驱动程序类TestPerson的错误。以下是java:- **我只是

  • 快速提问,我正在学习接口和继承。 这不是实际的代码,只是一个例子。假设我有抽象类“动物”。对马和犬类等组有一些继承。还有一个接口“宠物”。它将用于动物的不同子类。犬类“狗”的子类实现了接口“宠物”。因此“狗”的所有子类也实现了接口“宠物”,而不必在“狗”的每个子类上单独实现“宠物”,对吗?