Java наследование / переопределение метод ISSUE - PullRequest
0 голосов
/ 26 октября 2019

хорошо, так что в предисловии ситуация. Мне дали задание с различными задачами. До сих пор я создал учетную запись столовой (которая будет показана ниже), класс главного меню, и теперь мне нужно создать еще один класс, который наследуется от учетной записи столовой, который называется StaffAccount. Объект StaffAccount должен содержать следующее дополнительное свойство:

discountRate - скидка по ставке (в процентах), применяемая ко всем покупкам

Объект StaffAccount должен содержать следующие дополнительные методы:

(i) StaffAccount (String newId, String newName, double discountRate)

Метод конструктора для инициализации свойств объекта StaffAccount с помощью трех параметров.

В учетной записи персонала у меня возникли проблемы сметод с именем PayForMeal (который является переопределенным методом), который в сводке назначения имеет целью:

Метод для записи стоимости еды. Баланс на объекте StaffAccount должен быть изменен, чтобы отразить скидку на стоимость еды (если стоимость не превышает доступный баланс).

Если стоимость превышает баланс, то будет выдано исключение для предупрежденияКлиент должен пополнить свой баланс - если клиент находится в пределах своего кредитного лимита, отрицательное значение будет записано в балансе, и статус учетной записи будет изменен, чтобы показать, что клиент использует кредит. Скидка не должна применяться, если клиент использует кредит.

Итак, моя проблема в том, как мне создать учетную запись персонала, используя предоставленный мне конструктор, а затем использовать переопределенный метод payForMeal, чтобы применить скидку ксоставьте сумму затрат на питание, затем вычтите дисконтированную сумму из остатка, которого там нет, поскольку он не находится в конструкторе для StaffAccount, но находится в конструкторе для CanteenAccount. Классы ниже, я просто хочу знать, возможно ли это, или я тупой

////// CANTEEN ACCOUNT \\\\\\\\

public class CanteenAcc 
{
        private String customerId; 
        private String name;
        private double balance;
        private static double minTopup = 2.00;
        private String status;
        private static double creditLimit = 5.00; 
        private static int transCount;

       /**
        * Constructor to create a Canteen account object using three parameters 
        * @param newId - String
        * @param newName - String
        * @param newBalance - Double
        */
       public CanteenAcc(String newId, String newName, double newBalance)
        { 
            this.customerId = newId;
            this.name = newName; 
            this.balance = newBalance;
        }
        public CanteenAcc(String newId, String newName)
        {
            this.customerId = newId;
            this.name = newName; 
        }

        //BEFORE EVERY METHOD AND CLASS YOU SHOULD HAVE JAVADOC COMMENTS.
        public void topUp(double depositAmount)
        {
            if(depositAmount > 0)
            {
                this.balance += depositAmount;
                this.status = "Valid";
            }else
            {
                this.status = "Invalid";

            }

        }  

         public void payForMeal(double amount) throws Exception
         {
            if(balance - amount < 0 && amount - balance <= creditLimit)
            {
                this.status = "Using Credit"; 
                double newBalance = balance - amount;
                balance = newBalance; 

                throw new Exception("\n\n-----------------------------\n"  
                        + "You must top-up your balance\n" 
                        + "Your new balance is: "+ balance + " GBP" +"\n" 
                        + "You are: " + status + "\n" 
                        + "-----------------------------\n");
            }
            else if(amount > creditLimit && balance < amount)
            {
                  throw new Exception("\n\n------------------------------\n"  
                        + "Cost exceeds the credit limit."
                          + "\n------------------------------\n");
            }
            else
            {   
                double newBalance = balance - amount;
                balance = newBalance; 
                transCount++;    
            }   
         }

       public String displayAccountDetails()  
       {
            StringBuilder ad = new StringBuilder(); 
            ad.append("------------------------\n");
            ad.append("****Account Details****\n");
            ad.append("------------------------\n");
            ad.append("\n");
            ad.append("****Customer ID****: \n" + customerId + "\n");
            ad.append("\n");
            ad.append("****Name****: \n" + name + "\n"); 
            ad.append("------------------------\n");
            ad.append("\n");
            return ad.toString();
       }

       public String getStatistics()
       {
            StringBuilder as = new StringBuilder();
            as.append("------------------------\n");
            as.append("    CANTEEN ACCOUNT    \n");
            as.append("------------------------\n");
            as.append("\n");
            as.append("****Transaction Count****\n");
            as.append(transCount + "\n");
            as.append("\n");
            as.append("****Account Balance****\n");
            as.append(balance + "\n");
            as.append("\n");
            as.append("***Account Status****\n");
            as.append(status + "\n");
            as.append("------------------------\n");
            return as.toString();
       }


       public double getBalance()
       {
          return balance;
       }

       public double getCreditLimt()
       {
           return creditLimit; 
       }

       public double getMinTopup() 
       {
           return minTopup;
       }

       public String getStatus()
       {
           return status; 
       }

       public static void updateCreditLimit(double newLimit)
       {
           creditLimit = newLimit; 

       }

       public static void updateMinTopup(double newTopup)
       {
            minTopup = newTopup; 
       }


}

//////// ОСНОВНОЙ МЕТОД ////////////////////////

public class Test 
{
    public static void main(String[] args) {


      String menuItems[] = {"1. Top up account ", "2. Pay for meal ", "3. Display Account Status",
                            "4. Display Account Balance ", "5. Display Account Details ", 
                            "6. Update credit limit ", "7. Update Minimum top-up ", "8. Exit program"}; 

      Menu myMenu = new Menu("Holiday Account", menuItems) ;
                int choice;
                Scanner keyb = new Scanner(System.in);
                                choice = myMenu.getChoice() ;

                do{
                choice = myMenu.getChoice();    
                //CanteenAcc Employee = new CanteenAcc("A01PL", "Patrick", 2);  
                CanteenAcc Employee2 = new StaffAccount("blah", "blah", 0.25);



                switch (choice)
                                {
                        case 1 : System.out.println("How much would you like to top-up: ");
                                        double deposit = keyb.nextDouble(); 
                                        Employee2.topUp(deposit);
                                        System.out.println("Your balance is: £" + Employee2.getBalance());
                                                                                break ;

                        case 2:         System.out.println("Input how much your meal costs: ");
                        try             {
                                        double amount = keyb.nextDouble();
                                        Employee2.payForMeal(amount);


                                        System.out.println("Your meal cost: " + amount);
                                        } catch(Exception ex)
                                        {
                                            System.out.println(ex.toString());
                                        }
                                        System.out.println("Your balance is: £" + Employee2.getBalance());
                                                                                break ;

                        case 3:         System.out.println(Employee2.getStatus());         
                                        break; 

                        case 4:         System.out.println("£" + Employee2.getBalance());
                                        break;

                        case 5:         System.out.println(Employee.displayAccountDetails());
                                        break;

                        case 6:         System.out.println("What amount would you like the new limit to be: ");
                                        double newLimit = keyb.nextDouble();
                                        CanteenAcc.updateCreditLimit(newLimit);
                                        System.out.println("The new credit limit is: " + newLimit);

                        case 7:         System.out.println("What amount would you like the new limit to be: ");
                                        double newMinTopup = keyb.nextDouble();
                                        CanteenAcc.updateMinTopup(newMinTopup);   
                                        System.out.println("The new minimum topUp is: " + newMinTopup);

                        case 8:         System.exit(0);                 
                                }

             }//End DoWhile
             while(choice != 8);   



    }

}

//// СЧЕТ ПЕРСОНАЛА ///////

public class StaffAccount extends CanteenAcc 
{

    private double discountRate; 

    public StaffAccount(String newId, String newName, double discountRate)
    {
       super (newId, newName); 

       this.discountRate = 0.25;
       balance = 0;


    }   

     public void setDiscountRate(double rate)
     {
         discountRate = rate; 
     }

     public double getDiscountRate()
     {
         return discountRate; 
     }

   public void payForMeal(double amount) throws Exception
         {

            amount = amount/discountRate; 
              super.payForMeal(amount);
        }

}

1 Ответ

0 голосов
/ 26 октября 2019

ОК:

  1. У вас есть CanteenAcc: хорошо. У вас также есть StaffAccount, который наследуется от CanteenAcc. Также хорошо.

  2. Вы должны аннотировать StaffAccount.payForMeal () с помощью @Override: Когда вы используете аннотацию @Override Java и почему?

  3. Ваши имена переменных должны начинаться со строчной буквы, например CanteenAcc employee2 = new StaffAccount("blah", "blah", 0.25);.

  4. updateCreditLimit () и updateMinTopup () должны NOT бытьstatic (потому что каждый отдельный объект может иметь различное значение): Java: когда использовать статические методы

... Наконец ...

С помощью CanteenAcc employee = new CanteenAcc("A01PL", "Patrick", 2); тогда employee.payForMeal () будет иметь поведение «CanteenAcc».

С CanteenAcc employee2 = new StaffAccount("blah", "blah", 0.25);, тогда employee2.payForMeal () будет иметьповедение "StaffAccount".

Q: Так в чем проблема? Помогает ли это уточнить ... или это просто еще больше запутывает вещи?


В коде, который вы опубликовали, есть ряд "неправильных" вещей. Я надеюсь, что у вас есть IDE и вы пройдете через отладчик с примерами тестовых значений.

Но к вашему первоначальному вопросу:

  1. Вы на правильном пути.

  2. Есть пара "незначительных" проблем, которые я отметил выше.

  3. Я не уверен, почему вы беспокоитесь о "конструкторах",Способ работы объектно-ориентированных языков (таких как Java) - если вы определяете правильные базовые классы и соответствующим образом «специализируете» поведение в подклассах, то - благодаря магии «наследования» - все «просто работает».

  4. Я немного изменил ваш код и написал другой «тестовый драйвер». Вот код и вывод:

StaffAccount.java

package com.example;

public class StaffAccount extends CanteenAccount {
    private double discountRate;

    public StaffAccount(String newId, String newName, double discountRate) {
        super(newId, newName);
        this.discountRate = discountRate;  // Set this to "discountRate", instead of hard-coding 0.25
        // You'll note that "balance" is implicitly set to "0.0" in the base class
    }

    public void setDiscountRate(double rate) {
        discountRate = rate;
    }

    public double getDiscountRate() {
        return discountRate;
    }

    @Override
    public void payForMeal(double amount) throws Exception {
        amount = amount / discountRate;
        super.payForMeal(amount);
    }
}

TestAccount.java

package com.example;

/**
 * Test driver
 * In a "real" application, I would implement these as a suite of JUnit tests
 */
public class TestAccount {

    private static void buyAMeal (CanteenAccount person, double cost) {
        try {
            person.payForMeal(cost);            
        } catch (Exception e) {
            System.out.println ("ERROR: " + e.getMessage());
        }
    }

    public static void main(String[] args) {
        System.out.println (">>Creating employee (\"CanteenAccount\" and employee2 (\"StaffAccount\") objects...");
        CanteenAccount employee = new CanteenAccount("A01PL", "Patrick", 2);  
        CanteenAccount employee2 = new StaffAccount("blah", "blah", 0.25);

        System.out.println (">>Checking initial balances...");
        System.out.println ("  employee balance=" + employee.getBalance() + ", creditLimit=" + employee.getCreditLimit());
        System.out.println ("  employee2 balance=" + employee2.getBalance() + ", creditLimit=" + employee2.getCreditLimit());

        System.out.println (">>Buying a $5.00 meal...");
        System.out.println ("  employee...");
        buyAMeal (employee, 5.00);
        System.out.println ("  employee balance=" + employee.getBalance() + ", creditLimit=" + employee.getCreditLimit());
        System.out.println ("  employee2...");
        buyAMeal (employee2, 5.00);
        System.out.println ("  employee2 balance=" + employee2.getBalance() + ", creditLimit=" + employee2.getCreditLimit());

        System.out.println (">>Add $5.00 and buy another $5.00 meal...");
        System.out.println ("  employee...");
        employee.topUp(5.0);
        buyAMeal (employee, 5.00);
        System.out.println ("  employee balance=" + employee.getBalance() + ", creditLimit=" + employee.getCreditLimit());
        System.out.println ("  employee2...");
        employee2.topUp(5.0);
        buyAMeal (employee2, 5.00);
        System.out.println ("  employee2 balance=" + employee2.getBalance() + ", creditLimit=" + employee2.getCreditLimit());
    }

}

Пример вывода:

>>Creating employee ("CanteenAccount" and employee2 ("StaffAccount") objects...
>>Checking initial balances...
  employee balance=2.0, creditLimit=5.0
  employee2 balance=0.0, creditLimit=5.0
>>Buying a $5.00 meal...
  employee...
ERROR: 

-----------------------------
You must top-up your balance
Your new balance is: -3.0 GBP
You are: Using Credit
-----------------------------

  employee balance=-3.0, creditLimit=5.0
  employee2...
ERROR: 

------------------------------
Cost exceeds the credit limit.
------------------------------

  employee2 balance=0.0, creditLimit=5.0
>>Add $5.00 and buy another $5.00 meal...
  employee...
ERROR: 

-----------------------------
You must top-up your balance
Your new balance is: -3.0 GBP
You are: Using Credit
-----------------------------

  employee balance=-3.0, creditLimit=5.0
  employee2...
ERROR: 

------------------------------
Cost exceeds the credit limit.
------------------------------

  employee2 balance=5.0, creditLimit=5.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...