Java - 从子类中访问和覆盖超类

时间:2015-07-25 21:42:59

标签: java override parent-child superclass

我是Java的新手,我正在开发一个项目,可以计算有/无员工折扣的价格。阅读下面的代码之后,有人可以向我解释为什么我需要更改我的代码才能获得正确的输出吗?我将在帖子的最后更详细地解释这个问题。如果我需要提供更多/更少的信息和方法,我可以清理这篇文章或让它更容易理解,请告诉我。如果我的问题太宽泛,请问我对你不了解的内容,我会尽力告诉你!谢谢!

父类(我不允许编辑此内容):

public class GroceryBill {
    private Employee clerk;
    private List<Item> receipt;
    private double total;
    private double internalDiscount;

    public GroceryBill(Employee clerk) {
        this.clerk = clerk;
        receipt = new ArrayList<Item>();
        total = 0.0;
        internalDiscount = 0.0;
    }

    public void add(Item i) {
        receipt.add(i);
        total += i.getPrice();
        internalDiscount += i.getDiscount();
    }

    public double getTotal() {
        return Math.rint(total * 100) / 100.0;
    }

    public Employee getClerk() {
        return clerk;
    }

    public void printReceipt() {
        System.out.println(this);
    }

    private String valueToString(double value) {
        value = Math.rint(value * 100) / 100.0;
        String result = "" + Math.abs(value);
        if(result.indexOf(".") == result.length() - 2) {
            result += "0";
        }
        result = "$" + result;
        return result;
    }

    public String receiptToString() {
        String build = "items:\n";
        for(int i = 0; i < receipt.size(); i++) {
            build += "   " + receipt.get(i);
            if(i != receipt.size() - 1) {
                build += "\n";
            }
        }
        return build;
    }

    public String toString() {
        return receiptToString() + "\ntotal: " + valueToString(total);
    }

    public String discountToString() {
        return receiptToString() + "\nsub-total: " + valueToString(total) + "\ndiscount: " + valueToString(internalDiscount) + "\ntotal: " + valueToString(total - internalDiscount);
    }

    public static class Employee {
        private String name;

        public Employee(String name) {
            this.name = name;
        }

        public String getName() {
            return name;
        }
    }

    public static class Item {
        private String name;
        private double price;
        private double discount;

        public Item(String name, double price, double discount) {
            this.name = name;
            this.price = price;
            this.discount = discount;
        }

        public double getPrice() {
            return price;
        }

        public double getDiscount() {
            return discount;
        }

        private String valueToString(double value) {
            String result = "" + Math.abs(value);
            if(result.indexOf(".") == result.length() - 2) {
                result += "0";
            }
            result = "$" + result;
            return result;
        }

        public String toString() {
            return name + " " + valueToString(price) + " (-" + valueToString(discount) + ")";
        }
    }
}

这是我的代码:

public class DiscountBill extends GroceryBill
{
    private int myDiscountCount;
    private double myDiscountAmount;
    private double myPrice;
    private boolean myStatus;
    private double myDiscountPercent;

    public DiscountBill(Employee clerk, boolean preferred)
    {
        super(clerk);
        myStatus = preferred;
    }

    public void add(Item myBill)
    {
        myPrice += myBill.getPrice();
        if (myStatus)
        {
            myDiscountAmount += myBill.getDiscount();
        }

        if (myDiscountAmount > 0 && myStatus)
        {
            myDiscountCount += 1;
        }
    }

    @Override
    public double getTotal()
    {
        if (myStatus)
        {
           myPrice = (double)Math.round(myPrice * 100) / 100;
           return myPrice - myDiscountAmount;
        }
        return (double)Math.round(myPrice * 100) / 100;
    }
    public int getDiscountCount()
    {
        return myDiscountCount;
    }
    public double getDiscountAmount()
    {
        return myDiscountAmount;
    }
    public double getDiscountPercent()
    {
        myDiscountPercent = (myDiscountAmount);
        return myDiscountPercent;
    }
}

最后,here是预期的输出,然后是我的具体问题:

如何让我的getTotal()方法正确输出总价格,同时仍然可以访问原始价格(1.35),以及如何将该答案应用于我的每个方法?

一些更重要的细节:

我得到的输出非常接近我需要的答案。从截图中可以看出,我通过了getTotal()方法的大部分测试,但随后它突然停止工作。此外,非常重要的是要注意,由于我设置的isFirstTime布尔标志,在getTotal中传递测试的原始值(值1.35)只能通过。正如您所看到的,其他三种方法在第一次测试时都失败了,因为它们没有布尔标志来检查它是否是第一个值。我知道这个标志系统效率很低,但我找不到另一种方法来获得正确的值。如果您想查看此网站的运作方式,here是我正在处理的问题的链接。

2 个答案:

答案 0 :(得分:0)

问题在于,第二次调用'getTotal()'时,实际上并没有减去折扣金额。

顺便说一下,这个第一时间布尔值似乎是错误的:为什么你第一次调用'getTotal()'时才给出折扣?

你不应该检查首选标志是否真的给予折扣?这是其他测试中出错的地方。

答案 1 :(得分:0)

你应该保留preferred的值,在类中声明一个(非静态)变量并修改构造函数,如下所示:

private boolean preferred;

public DiscountBill(Employee clerk, boolean preferred)
{
    super(clerk);
    this.preferred = preferred;
}

然后,在getTotal函数中,我会做这样的事情:

@Override
public double getTotal()
{
    if(preferred){
        return myPrice - myDiscountAmount;
    }
    else return myPrice;
}

有了它,它应该工作。此外,我注意到您在添加项目时忘记添加折扣:

myDiscountAmount = myBill.getDiscount();

而不是

myDiscountAmount += myBill.getDiscount();

其他方法也是如此:例如:

public int getDiscountCount() {
        if (preferred) {
            return myDiscountCount;
        } else
            return 0;
    }