2016-05-13 117 views
0

如果我想使用正在初始化類Worker的動態數組列表,我可以添加擴展Worker類的子類並嘗試用下面的測試類填充數據嗎?每當我嘗試調用某個函數其中一個子類有我得到一個錯誤,我需要調用這些函數,所以我如何正確地做到這一點?我可以爲動態數組列表超類的類型對象創建一個子類對象嗎?

public class Worker extends Person { 
     private int id; 

     Worker() { 
     } 

     Worker(int i) { 
      id = i; 
     } 

     public int getId() { 
      return id; 
     } 

     public void setId(int id) { 
      this.id = id; 
     } 

     public String toString() { 
      return super.toString() + "ID: " + id + " "; 
     } 
    } 


    public class HourlyWorker extends Worker implements Annual { 
     private double rate; 
     private double AnnualPayment; 
     private double percentageIncrease; 

     HourlyWorker() { 
     } 

     HourlyWorker(double r) { 
      rate = r; 
     } 

     public double getAnnualPay(double Annualpayment) { 
      return Annualpayment = rate * 52 * 40; 
     } 

     public double getRate() { 
      return rate; 
     } 

     public void setRate(double rate) { 
      this.rate = rate; 
     } 

     public double getAnnualPayment() { 
      return AnnualPayment; 
     } 

     public void setAnnualPayment(double AnnualPayment) { 
      this.AnnualPayment = AnnualPayment; 
     } 

     public double getpercentageIncrease() { 
      return percentageIncrease; 
     } 

     public void setpercentageIncrease(double percentageIncrease) { 
      this.percentageIncrease = percentageIncrease; 
     } 


     public void increasePayment(double r) { 
      increasePayR(r); 
     } 

     public double increasePayR(double r) { 
      return rate = (AnnualPayment + getAnnualPay(r) * percentageIncrease)/2080; 
     } 

     public String toString() { 
      return "Your rate : " + rate + " "; 
     } 
    } 


    public class SalariedWorker extends Worker implements Annual { 
     private double salary; 
     private double AnnualPayment; 
     private double percentageIncrease; 

     SalariedWorker() { 
     } 

     SalariedWorker(double s) { 
      salary = s; 
     } 

     public double getAnnualPay(double Annualpayment) { 
      return Annualpayment = salary * 12; 
     } 

     public void increasePayment(double r) { 
      increasePayS(r); 
     } 

     public double increasePayS(double r) { 
      return salary = (AnnualPayment + getAnnualPay(r) * percentageIncrease)/12; 
     } 

     public double getSalary() { 
      return salary; 
     } 

     public void setSalary(double salary) { 
      this.salary = salary; 
     } 

     public double getAnnualPayment() { 
      return AnnualPayment; 
     } 

     public void setAnnualPayment(double AnnualPayment) { 
      this.AnnualPayment = AnnualPayment; 
     } 

     public double getpercentageIncrease() { 
      return percentageIncrease; 
     } 

     public void setpercentageIncrease(double percentageIncrease) { 
      this.percentageIncrease = percentageIncrease; 
     } 

     public String toString() { 
      return " "; 
     } 
    } 


    public class Test { 

     public static void main(String[] args) { 
      Scanner prompt = new Scanner(System.in); 
      ArrayList<Worker> Worker1 = new ArrayList<Worker>(); 

      Worker1.add(new SalariedWorker());// is it alright to create a subclass object here? 
      Worker1.add(new SalariedWorker(1000.0));// index 1 
      Worker1.add(new HourlyWorker());// index 2 
      Worker1.add(new HourlyWorker(100.0));// index 3 

      System.out.println("Enter your monthly salary: "); 
      double salary = prompt.nextDouble(); 
      Worker1.get(0).getSalary(salary);//gets me an error 
      System.out.println("Enter your hourly rate: "); 
      double HourlyRate = prompt.nextDouble(); 

      System.out.println("Enter the Percentage Increase for a Salaried worker: "); 
      double PercentIncreaseS = prompt.nextDouble(); 
      Worker1.get(0).getpercentageIncrease(PercentIncreaseS);//gets me an error 
      System.out.println("Your Increased payment is: "); 
      System.out.println("Enter the Percentage Increase for an Hourly worker: "); 
      double PercentIncreaseH = prompt.nextDouble(); 
     } 
    } 
+0

我們就可以有很大的幫助更好,如果你有實際誤差的全部細節,並嘗試格式化您的一些代碼。 –

+0

是的,你可以創建一個運行時對象(就像你想要使用的唯一的地方),但如果你需要多次使用它,你必須聲明它和錯誤的東西,你必須提供來自控制檯的完整錯誤 – emotionlessbananas

+0

和getsalary dosen沒有任何參數 – emotionlessbananas

回答

1

你所得到的錯誤,因爲Worker類沒有一個getSalary()方法。

您需要將列表中的對象轉換爲適當的子類類型。

例如:

SalariedWorker sw = (SalariedWorker) Worker1.get(0); 
sw.getSalary(salary); 
0

問題與下面的代碼片段:

ArrayList<Worker> Worker1 = new ArrayList<Worker>(); 
Worker1.get(0).getSalary(salary); 

get會回報你的abstraction不具備getSalary(salary)方法。你所要做的就是分別使用相應的實現類進行投射,並調用其上的方法。 例如:

SalariedWorker sw = (SalariedWorker)Worker1.get(0); 
相關問題