2009-10-14 2 views
0

지금까지 작성한 코드가 있습니다. 그것의 기능과 유일한 불만은 주간 및 연간 지불에 대한 내 산출물은 항상 매주입니다 ... 나는 toString 메서드 내에서 이것을 얻는 방법을 잃어 버렸습니다.다형 부모 클래스가 그 자체 내에서 서브 클래스 메서드를 호출하는 이유는 무엇입니까?

public class PolyEmployees { 
    public static void main(String[] args) { 

     Employee [] myEmployees = { 
      new Hourly("Joan Rivers", "Human Resources", 12.45, 34.3), 
      new Hourly("Jason Nezbit", "Accounting", 15.25, 46.0), 
      new Hourly("Ingrid Homes", "Secretary", 10.11, 38.7), 
      new Salaried("Amy Liberman", "Human Resources Executive", 32.50), 
      new Salaried("Xander Xavar", "Resource Processing", 29.20), 
      new Salaried("Milly Rockhome", "PR Executive", 65.28) 
     }; 

     // Output all employee types 
     for (int i = 0; i < myEmployees.length; i++) { 
      System.out.println("\n" + myEmployees[i].toString()); 
     }     
    } 

} 

/* 
* Employee abstract class 
*/ 

abstract public class Employee { 
    private String mName; 
    private String mDepartment; 
    protected Double mRate; 

    // Constructor 
    public Employee(String mName, String mDepartment, Double mRate) { 
     this.mName = mName; 
     this.mDepartment = mDepartment; 
     this.mRate = mRate; 
    } 

    // Annual Pay 
    public Double pay() { // 40 Hours a Week, 52 weeks in a year 
     return ((this.mRate * 40) * 52); 
    } 

    @Override 
    public String toString() { 
     return "Employee: " + this.mName + "\nDepartment: " + this.mDepartment + "\nAnnual Pay: " + this.pay(); 
    } 
} 

/* 
* Hourly employee class 
*/ 

public class Hourly extends Employee { 
    private Double mHours; 

    public Hourly(String mName, String mDepartment, Double mRate, Double mHours) { 
     super(mName, mDepartment, mRate); 
     this.mHours = mHours; 
    } 

    @Override 
    public Double pay() { // Weekly Pay, deals with overtime for hourly employee 

     if (this.mHours > 40.0) { 
      return ((40 * this.mRate) + ((this.mHours-40) * (this.mRate * 1.5))); 
     } 
     else { 
      return (this.mHours * this.mRate); 
     }  
    } 

    public String toString() { 
     return super.toString() + "\tWeekly Pay: " + pay(); 
    } 

} 

/* 
* Salaried Employee Class 
*/ 

public class Salaried extends Employee{ 

    public Salaried(String mName, String mDepartment, Double mRate) { 
     super(mName, mDepartment, mRate); 
    } 

    @Override 
    public Double pay() { // Weekly Pay 
     return (this.mRate * 40); 
    } 

    @Override 
    public String toString() { 
     return super.toString() + "\tWeekly Pay: " + this.pay(); 
    } 
} 

나는 연봉을 제외한 모든 출력을 얻습니다. 디버거를 따라 가면 부모 내에서 호출 할 때도 childs pay 메서드로 돌아갑니다. 그것이 오버라이드 된 이래로 나는 이것에 정말로 놀랐지 만, 나의 전달물의 일부는 서브 클래스에서 매주 얻고 슈퍼에서 연례로 얻는 것이다.

내 질문에 답하는 것이므로 어떻게 부모로부터 연봉을받을 수 있습니까? 나는 시스템 출력의 일부로 직원으로 캐스팅 할 수밖에 없습니까? 아니면 제가 누락 된 부분이 있습니까?

사이드 노트에 나는이 사이트가 얼마나 유동적 인 지 알고 있습니다. 내가 입력 한대로 소식을 게시 한 적이 많은 곳이 아닙니다.

의견에 대한 주석 : 내 결과물에 따르면 봉급을받는 직원과 시간 종업원 인 toString은 모두 주급을 반환해야합니다. 직원 추상 클래스 자체에는 연간 임금을 반환하는 메서드가 포함되어 있습니다.

답변

1

하위 클래스에서 super를 호출 할 수 있습니다. 귀하의 toStringSalaried, 예를 들어, 다음과 같이 수 : Employee에서 pay()를 호출

return super.toString() + "\tWeekly Pay: " + this.pay()+ "\tAnnual Pay: " + super.pay()); 
+0

넵 나는 생각하지 못해서 어리석은 기분이 들었다. 이것은 내가 찾고있는 해결책이다. 친절하게 감사한다. :) – Mohgeroth

0

하위 클래스에서는 pay() 메소드를 재정의합니다. 직원이 연간 임금과 정기 임금을 모두 갖기를 원하면, 서브 클래스가 재정의 할 finalPay() 추상 메소드를 추가하고 pay()를 final로 남겨 두어야합니다.

1

예는, 참으로 Salaried 개체의 맥락에서 Salaried.pay()를 호출합니다. 이것이 다형성의 핵심입니다. 파생 된 클래스가 동작을 재정의 할 수 있습니다. 아마도 단지 기본 클래스에서 getAnnualPay()을 가진, 그리고 SalariedgetWeeklyPay()을 소개 -

지금 당신이 getAnnualPay()getWeeklyPay()에 대해 별도의 방법이 있다면 수업이 많은 명확하게 될 것이라고 저를 친다.

+0

예, 분명 할 것입니다. 유감스럽게도 이것은 숙제를위한 것입니다. 언제든지 더 많은 기능을 추가하려고 할 때마다 교수님은 저에게서 점수를 얻는 것을 즐깁니다. 느슨한 비즈니스 규칙 : ( – Mohgeroth

+1

실제로 얼마를 지정 했습니까? 중요한 점은, 오버라이드 된 지불 방법이 호출 된 이유를 이해하는 것입니다. –

+0

예, 지금은 이해하지만 처음에는 슈퍼 대신 부모님에게서 돈을 지불하고 나서 놀랐습니다. 무시 무시한 부분이 지금까지는 이해가되지 않았던 것 같아요 누군가가 부모로부터 그것을 얻는 방법으로 super.pay를 게시하면, 그것은 일종의 클릭이었습니다. 이미 수퍼 클래스 toString을 자식으로부터 호출 했으므로 같은 호출을 사용하여 보수를받는 것을 생각하지 않은 것에 대해 어리석은 느낌을 갖습니다. – Mohgeroth

관련 문제