2016-05-13 1 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

и getalary 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); 

прибудете возвратит вас abstraction, который не имеет метод getSalary(salary). Все, что вам нужно сделать, это бросить каждого с соответствующим классом реализации и вызвать метод на нем. Ex:

SalariedWorker sw = (SalariedWorker)Worker1.get(0); 
Смежные вопросы