【问题标题】:Can I add code to an inherited method without overriding the whole method?我可以在不覆盖整个方法的情况下将代码添加到继承的方法吗?
【发布时间】:2021-06-05 05:39:03
【问题描述】:

我从抽象类X 继承了一个公共方法,但我不想覆盖复制和粘贴整个内容并添加两行代码的方法,我只想使用已经在抽象中的代码类而不用重新写一遍,只写额外的两行。我已经编写 Java 一个多月了,但到目前为止我还没有找到解决方法,这可能吗?

这是抽象类内部的方法:

public UsineOrganisme copieAUsine() {
    UsineOrganisme usine = new UsineOrganisme();
    usine.setNomEspece(this.nomEspece);
    usine.setEnergieEnfant(this.energieEnfant);
    usine.setBesoinEnergie(this.besoinEnergie);
    usine.setEfficaciteEnergie(this.efficaciteEnergie);
    usine.setResilience(this.resilience);
    usine.setFertilite(this.fertilite);
    usine.setAgeFertilite(this.ageFertilite);
    usine.setDebrouillardise(this.debrouillardise);

    //Ajouter les aliments de l'espèce
    for (String especeComestible : this.getAliments()) {
        usine.addAliment(especeComestible);
    }
    return usine;
}

我希望我在普通类中继承的方法相同,但在返回“usine”之前添加这两行。

public UsineOrganisme copieAUsine() {
    //Same Code but adding these two setters
    usine.setVoraciteMin(this.voraciteMin);
    usine.setVoraciteMax(this.voraciteMax);

    return usine;
}

【问题讨论】:

    标签: java inheritance methods abstract-class


    【解决方案1】:

    是的,在您的情况下,您只需调用超级实现:

    @Override
    public UsineOrganisme copieAUsine(){
        UsineOrganisme usine = super.copieAUsine();
    
        usine.setVoraciteMin(this.voraciteMin);
        usine.setVoraciteMax(this.voraciteMax);
    
        return usine;
    }
    

    【讨论】:

    • 在我的例子中,第一个方法也被另一个抽象类继承。我有以下层次结构: 1. 抽象类有机体(它具有我在没有 for 循环的情况下发布的方法) 2. 抽象类动物扩展有机体 3. 草食动物类扩展动物如果我使用“UsineOrganisme usine = super.copieAUsine();”在食草动物中,它会覆盖 Animal 或 Organisme 使用的方法吗?
    • super 调用将调用超级实现。如果您覆盖Animal 中的方法,则将调用该方法。如果不这样做,则将调用 Organismes 中的方法。
    【解决方案2】:

    是的,在此方法不是final的情况下,super.methodName() 构造可以做到这一点。例如,您可以重写ArrayList预定义方法,如下所示:

    List<Integer> list = new ArrayList<>() {
        @Override
        public boolean add(Integer integer) {
            // custom action
            integer += 1;
            System.out.println("Add number: " + integer);
            // predefined action
            return super.add(integer);
        }
    };
    list.add(3);
    System.out.println("List contents: " + list);
    

    输出:

    Add number: 4
    List contents: [4]
    

    另见:Is it possible to override a method comment but not the method?

    【讨论】:

      猜你喜欢
      • 2015-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-07
      • 2020-09-08
      • 1970-01-01
      相关资源
      最近更新 更多