2016-03-15 4 views
0

Я работаю с классом Employee и двумя подклассами, называемыми SalariedEmployee и HourlyEmployee. В этой части моего кода я пытаюсь проверить, является ли Employee в массиве либо SalariedEmployee, либо HourlyEmployee. Тем не менее, это только печать атрибутов из исходного класса Employee, а не из подклассов.instanceof с массивами Java

case 2: { 
    for(int index = 0; index < employees.length; index++) { 
      System.out.println(employees[index] + "\n"); 
      if(employees[index] instanceof SalariedEmployee) { 
       SalariedEmployee aSalariedEmployee = (SalariedEmployee) employees[index]; 
       System.out.println(aSalariedEmployee.toString()); 
      } 
      else if(employees[index] instanceof HourlyEmployee) { 
       HourlyEmployee anHourlyEmployee = (HourlyEmployee) employees[index]; 
       System.out.println(anHourlyEmployee.toString()); 
      } 
      else { 
       System.out.println(" "); 
      } 
     } 
     System.out.println(" "); 
     break; 
} 

Вот сбора данных часть моего кода: (EDIT: обновлен = к == в то время как петля)

int typeEmployee; 
boolean loop = true; 
OUTER: 
while (loop == true) { 
    System.out.print("Enter 1 if the Employee is Salaried, 2 if Hourly: "); 
    typeEmployee = info.nextInt(); 
     switch (typeEmployee) { 
      case 1: 
       System.out.print("Enter the Employee's Salary (with no commas): "); 
       float annSalary = info.nextFloat(); 
       SalariedEmployee aSalariedEmployee = new SalariedEmployee(annSalary); 
       aSalariedEmployee.setAnnualSalary(annSalary); 
       break OUTER; 
      case 2: 
       System.out.print("Enter the Employee's Hourly Pay Rate: "); 
       float hPRate = info.nextFloat(); 
       System.out.print("Enter the number of Hours Worked in a week: "); 
       float hWorked = info.nextFloat(); 
       HourlyEmployee anHourlyEmployee = new HourlyEmployee(hPRate, hWorked); 
       anHourlyEmployee.setHourlyPayRate(hPRate); 
       anHourlyEmployee.setHoursWorked(hWorked); 
       break OUTER; 
      default: 
       System.out.println("Invalid Option."); 
       break; 
     } 
} 

Я чувствую, что я здесь не хватает, я должен каким-то образом связать typeEmployee с самим объектом. Кто-нибудь знает, как я могу это сделать? Спасибо за помощь.

+2

Не должен 'while (loop = true)' be 'while (loop)' (без возможного вредоносного назначения) или 'for (;;)' (простой бесконечный цикл)? – MikeCAT

+0

Да, это была неосторожная ошибка с моей стороны, но она все еще не отвечает на больший вопрос. – mellerlite

+0

Вам не нужно проверять 'instanceof SalariedEmployee' и т. Д.' Employees [index] .toString() 'и' ((SalariedEmployee) employees [index]). ToString() 'вызывает точно такой же метод. –

ответ

2

это только печать атрибутов из исходного класса Employee, не из подклассов.

Вам необходимо переопределить toString() в подклассах, чтобы добавить новые атрибуты.

+0

И если это все, что вам нужно, вам не нужно делать 'instanceof' и бросать на всех. Если экземпляры сотрудника знают, как печатать себя, метод вызова не должен различать. Красота полиморфизма. – Thilo

+0

@Thilo Я уже добавил переопределение перед методом toString в подклассах, но он по-прежнему не работает. – mellerlite

+0

Включите в вопрос все реализации методов 'toString'. – Thilo