2015-07-25 5 views
1

Я новичок в Java, и я работаю над проектом, который работает с расчетом цен с/без скидок для сотрудников. Прочитав следующий код, кто-нибудь может объяснить мне, как мне нужно изменить свой код, чтобы получить правильный результат? Я объясню этот вопрос более подробно в конце сообщения.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; 
     
    public DiscountBill(Employee clerk, boolean preferred) 
    { 
        super(clerk); 
         
        String name = ""; 
        double price = 0; 
        double discount = 0; 
         
        GroceryBill.Item myBill = new GroceryBill.Item(name, price, discount); 
        myDiscountAmount = myBill.getDiscount(); 
         
        if (myDiscountAmount > 0 && preferred) 
        { 
            myDiscountCount++; 
        } 
    } 

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

     if (myDiscountAmount > 0) 
     { 
      myDiscountCount++; 
     } 
    } 
    public double getTotal() 
    { 
     if (myDiscountCount > 0) 
     { 
      return myPrice - myDiscountAmount; 
     } 
        return myPrice; 
    } 
    public int getDiscountCount() 
    { 
        return myDiscountCount; 
    } 
    public double getDiscountAmount() 
    { 
        return myDiscountAmount; 
    } 
    public double getDiscountPercent() 
    { 
        return ((myPrice - myDiscountAmount)/myPrice * 100); 
    } 
} 

Наконец, here является ожидаемым результатом следуют моим конкретный вопрос:

Результаты, которые я получаю для своих методов, на один шаг впереди, где они должны быть. То есть мой getTotal, например, должен начинаться с 1.35 (первое значение, вводимое используемым мной веб-сайтом, которое проверяет мой дочерний класс, который я написал), а затем после очередного шага его следует уменьшить до 1.1 (веб-сайт использует скидку сотрудника, используя логическое значение, предпочитаемое конструктором), но моя программа выводит 1.1, потому что мой дочерний класс переопределяет метод getTotal() родительского класса и никогда не начинается с общего количества, которое должно (1.35). В основном мне нужно знать, как получить эти исходные значения из моего родительского класса, а THEN использовать методы переопределения для получения значений после их изменения. Если вы хотите посмотреть, как работает этот сайт, here - это ссылка на вопрос, над которым я работаю.

P.S. Пожалуйста, дайте мне знать, если мне нужно предоставить больше/меньше информации и способы, чтобы я мог очистить этот пост или упростить его понимание. Если бы мой вопрос был слишком широким, спросите меня, что вы не понимаете, и я постараюсь изо всех сил сказать вам! Спасибо!

+0

'myPrice' в' DiscountBill' и 'total' в' GroceryBill' такие же? – Karthik

+0

@karthik myPrice в DiscountBill изменяется для размещения скидок для сотрудников, тогда как общая сумма в GroceryBill не зависит от скидок. Мне нужно использовать общее количество для первого вывода, а затем myPrice для остальных. Моя проблема заключается в том, что моя программа использует myPrice все время и полностью переопределяет add() и getTotal() из GroceryBill. – Trafton

+0

Я не уверен. Если я полностью понимаю ваш вопрос, я добавил ответ. Просто проверьте и дайте мне знать, что вы хотите. – Karthik

ответ

0

Насколько я понял ваш вопрос, что вы хотите сделать, это:

Добавить этот дополнительный код для вашего DiscountBill

public class DiscountBill extends GroceryBill 
{ 
    private static boolean isFirstTime = true; 

    public double getTotal() 
    { 
     if (!isFirstTime && myDiscountCount > 0) 
     { 
      return myPrice - myDiscountAmount; 
     } 
     isFirstTime = false; 
     return myPrice; 
    } 

} 
+0

Это сделало мой первый getTotal() return 0.0. По какой-то причине он не получил 1,35, как должно. – Trafton

+0

@Trafton 'Мне нужно использовать общее количество для первого вывода, а затем myPrice для остальных', как вы ожидаете' 1.35' ?? что в этом случае «1.35»? это 'myPrice'? – Karthik

+0

веб-сайт, который я использую, принимает класс, который я написал, и автоматически проверяет его с помощью собственных входов. Первый ожидаемый результат для getTotal() равен 1,35, тогда программа снова проверяет цену, но с скидкой на сотрудника (предпочтительным является логическое значение, которое является параметром в моем конструкторе в дочернем классе). – Trafton

0

Я не уверен, если это то, что вы хотите. Вы хотите вызвать родительский метод? Для этого вы можете использовать super.parentMethodName Пожалуйста, исправьте меня, если я ошибаюсь

+0

Пожалуйста, обратитесь к ответу Karthik (и комментариям ниже), чтобы лучше понять вопрос, который я задаю. – Trafton

+0

У меня недостаточно репутации, чтобы сделать это – Berrigan

+0

myPrice в DiscountBill изменен для размещения скидок для сотрудников, тогда как общая сумма в GroceryBill не зависит от скидок. Мне нужно использовать общее количество для первого вывода, а затем myPrice для остальных. Моя проблема заключается в том, что моя программа использует myPrice все время и полностью переопределяет add() и getTotal() из GroceryBill. – Trafton

Смежные вопросы