2016-05-13 121 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); 
相关问题