【问题标题】:Super class method using subclass method超类方法使用子类方法
【发布时间】:2014-05-13 02:32:49
【问题描述】:

很抱歉这个问题含糊不清,但我发现很难正确说出标题。

我有一个超类,其中包含一个名为 calculateTotal() 的方法和一个名为 toString() 的方法。 我也有一个覆盖这两种方法的子类。

我遇到的问题是,当我从子类调用 toString() 时,super.toString() 部分返回一个字符串,该字符串具有从子类的 calculateTotal() 返回的值。 因此,我得到的 Total: 和 Grand Total: 的值相同,都是添加的 handlingFee 值。

为了说明问题,这里有一个示例输出。

预期产出:总计:20,加上 4 美元的手续费,总计:24 美元

当前输出:总计:24,加上 4 美元的手续费,总计:24 美元

任何帮助或建议将不胜感激!谢谢,

代码:

超类:

public class SuperClass {
    private double unitPrice;
    private int quantityOrdered;

    public double calculateTotal() {

        return unitPrice * quantityOrdered;
    }

    public String toString() {

        return String.format("\nUnit Price: %.2f\nQuantity Ordered: %d\nTotal: %.2f", unitPrice, quantityOrdered, calculateTotal());
    }
}

子类:

public class SubClass extends SuperClass {

    private double handlingFee;
    public double calculateTotal() {

        return unitPrice * quantityOrdered + handlingFee;
    }

    public String toString() {

        return String.format("%s\nPlus a $%.2f handling charge\nGrand Total: $%.2f", super.toString(), handlingFee, calculateTotal());
    }
}

【问题讨论】:

  • 如果您不希望子类的calculateTotal() 覆盖超类的版本,您应该或者给它一个不同的名称,或者超类的私有版本。
  • 不确定您的子类如何访问 unitPrice,因为它在超类中被声明为私有。您通常可以通过使用调试器逐步解决这些类型的问题或添加记​​录器语句来查看正在发生的情况。
  • 调试器不会帮助 OP,也不会记录日志。他/她确切地知道发生了什么,他/她只是不喜欢它。
  • 谢谢,我想我对面向对象设计的理解还是欠缺的。非常感谢您的帮助!

标签: java overriding subclass superclass super


【解决方案1】:

当你有一个子类的实例时,你就没有一个单独的超类实例。因此,当超类方法调用 calculateTotal() 时,它会调用为该签名定义的最低(在子类链中)方法。

听起来您可能想要一个未在子类中覆盖的 calculateSubTotal() 方法,因为您不希望子类更改超类中小计的计算。

【讨论】:

  • 感谢您的解释。我希望调用超类方法也会自动使用被调用的任何其他方法的超版本。我不知道它会寻找同名的最低方法。感谢您帮助我完成学习过程。
【解决方案2】:

这种模式常见于JDK或者Spring Framework,超类是这样的抽象类:

public abstract class A {

    public void method1(){
        method2();
    }
    public abstract void method2 (); 
}


public class B extends A {

    @Override
    public void method2(){
        System.out.println("method2 has been called");
    }
}

【讨论】:

    猜你喜欢
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    • 2012-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多