2013-09-30 3 views
0

현재 직원 데이터베이스를 생성하는 작업을하고 있습니다.자바 배열에 하위 클래스 추가 및 나중에 나중에 꺼내기

지금 당장은 Employee라는 추상 클래스를 만들었습니다. 그로부터 HourlyEmployee, SalaryEmployee 및 CommissionEmployee 하위 클래스가 있습니다.

모든 유형의 신입 사원을 생성 할 때 할당을 위해서는 모두 배열에 저장해야합니다. 그런 다음 나중에 직원 유형을 기반으로 직원을 나열 할 수 있어야합니다. addMemployee()에 전달되는 int는 다른 클래스의 내 기본 메소드에서 가져오고, 여기서 메뉴는 원하는 직원 유형에 대해 1-3을 선택하도록 요청합니다.

public class EmployeeManager{ 

    private Employee[] employees; 
    private final int employeeMax = 100; 
    private int currentEmployees; 


    public EmployeeManager() 
    { 
     employees = new Employee[employeeMax]; 
     currentEmployees = 0; 

    } 

    public void addEmployee(int ty, String fn, String ln, char mi, char gen, int empNum, boolean ft, double p) 
    { 

     if(ty == 1) 
     { 
      employees[currentEmployees] = new HourlyEmployee(fn, ln, mi, gen, empNum, ft, p); 

      currentEmployees++; 
     } 
     else if(ty == 2) 
     { 
      employees[currentEmployees] = new SalaryEmployee(fn, ln, mi, gen, empNum, ft, p); 

      currentEmployees++; 
     } 
     else if(ty == 3) 
     { 
      employees[currentEmployees] = new CommissionEmployee(fn, ln, mi, gen, empNum, ft, p); 

      currentEmployees++; 
     } 
    } 

지금이이 배열 내에있는 직원의 유형을 식별하는 방법이다 그러나 무엇을 누락, 배열에 직원을 추가하기위한 잘 작동합니다. 나중에 Hourly, Salary 또는 Commission 유형의 모든 직원을 인쇄하는 메소드를 구현해야합니다. 배열 내의 직원을 어떻게 식별하여 나중에 해당 유형의 모든 직원 목록을 인쇄 할 수 있습니까?

public void listAll() 
{ 
    if(currentEmployees == 0) 
    { 
     System.out.println("\nNo Employees."); 
    } 
    else 
    { 
     for (int i=0; i < employees.length; i++) 
     { 
      if(employees[i] != null) 
      { 
       System.out.print(employees[i]); 
      } 
     } 
    } 

} 

이것은 모든 유형의 직원을 인쇄하는 제 방법입니다. 각 클래스에는 필자가 필요로하는 방식으로 출력 형식을 지정하는 toString() 메서드가 있습니다.

+0

다형성과 구현 된 (오버라이드 된)'toString' 메소드 덕분에 각 인스턴스의 유형을 알 필요가 없습니다. –

+0

각 인스턴스의 유형을 알 필요가없는 경우 어떻게 배열을 통해 HourlyEmployee 유형의 직원 만 인쇄 할 수있는 메서드를 작성할 수 있습니까? – Neonjoe

+0

약간의 주제를 벗어난 제안 : employees.length를 확인하여 직원 수를 얻으려면 currentEmployees를 추적하고 구현할 필요가 없습니다. 동일한 정보를 저장하는 것은 서로 다른 두 가지 방법이 혼란을 야기합니다. 더 나쁜 것은 무언가가 잘못되어 증가하지 못하면 이제는 일치하지 않는다는 것입니다. 나는 그것을 한 가지 방법으로 만하는 것이 좋습니다. – Brandon

답변

2

당신이 정말로 개체의 유형을 알고 싶다면이 방법을 수행 할 수 있습니다

if (employees[i] instanceof HourlyEmployee) { 
// Hourly employee 
} 
+0

구현하려고 시도하고 작동하는지 확인 – Neonjoe

+0

정말 멋졌습니다. 이제 모든 객체 유형에 대해 구현할 수 있습니다. 감사합니다! – Neonjoe

+0

@ Neonjoe 모든 배열을 동일한 배열에 추가 할 때마다 배열을 사용할 때마다 부모 클래스를 사용하는 추상화가 도움이되지 않는다는 것을 나타내는 instanceof check를 수행해야한다는 것을 지적해야합니다. 간단히 hourlyEmployees 배열, salaryEmployees 배열 등을 가질 수 있습니다. – Brandon

0

당신은 단순히 toString()와 각 개체를 인쇄하려는 경우 당신이 무엇을 원하는에 따라 다르지만, 단순히 현재 솔루션 object 당신이 통과 인수가 어디 System.out.print() 방법은 실제로 object.toString() 호출

if(employees[i] != null) 
{ 
    System.out.print(employees[i]); 
} 

를 사용합니다. 이 경우 employees[i]이 참조하는 개체입니다. 따라서 Employee 하위 클래스 각각에 toString() 메서드를 구현할 수 있습니다. Late-binding 및 유형에 따라 다형성이 올바른 메소드 호출을 처리합니다.