2012-12-07 30 views
3

我有一個小型項目,我正在使用繼承和多態。我有一個Employee類型的ArrayList,它包含Hourly和Salary員工對象。我希望能夠使用for循環在Hourly類中調用calcPay函數,前提是Employee類型的ArrayList中的對象是Hourly員工。該行在arraylist中使用多態性調用子方法

System.out.println("Wage: " e.calcPay()); 

給出錯誤The method calcPay() is undefined for type employee。你如何低調對象?我在很多論壇上看過,我找不到一個允許我內聯或不寫一個抽象方法的選項,我不得不將其包含在Employee的所有子類中。任何有識之士將不勝感激。

public class Driver { 

    public static void main(String[] args) { 

      ArrayList<Employee> list = new ArrayList<Employee>(); 
      Employee emp1 = new Hourly("Hourly Emp", "123 E Center", "555-555-5555", 00001, "123-45-6789", 12.75); 
      Employee emp2 = new Salary("Salary Emp", "123 E Center", "555-555-5555", 00001, "123-45-6789"); 

      list.add(emp1); 
      list.add(emp2); 

      for(Employee e : list){ 
       if(e instanceof Hourly) 
       { 
        System.out.println("Wage: " e.calcPay()); 
       } 
      } 
    } 

    public abstract class Employee { 

     private String name, address, phone, ssn; 
     private int empNo; 

     Employee(String name, String address, String phone, int empNo, String ssn) 
     { 
      this.name = name; 
      this.address = address; 
      this.phone = phone; 
      this.empNo = empNo; 
      this.ssn = ssn; 
     } 
    } 


    public class Hourly extends Employee { 

     private double wage; 

     Hourly(String name, String address, String phone, int empNo, String ssn, double wage) 
     { 
      super(name, address, phone, empNo, ssn);   
        this.wage = wage; 
     } 

     public double calcPay(double hours) 
     { 
       return wage * hours; 
     } 
    } 

回答

3

即使您確保e是類型的每小時,你仍然需要轉換,並使用Hourly類型調用calcPay()因爲e是Employee類型,並因爲你的員工不知道任何calcPay()方法定義爲calcPay(),因爲只有Hourly類方法。

  if(e instanceof Hourly) 
       { 
       Hourly hourly = (Hourly)e; 
        System.out.println("Wage: " hourly.calcPay()); 
       } 

如果你想calcPay()的所有員工實例訪問,你需要定義calcPay()爲Employee類的抽象方法,那麼就可以避免鑄造。

更新時間:

if(e instanceof Hourly) 
       { 
        System.out.println("Wage: " ((Hourly)e).calcPay()); 
       } 
+0

跟隨這個問題 - 它可以內聯嗎?如果不是,因爲我在同一時間學習C++,是「小時」類似的參考,即:沒有佔用堆空間? – Wheeler

+0

是的,小時是不佔用堆空間的引用,佔用堆棧空間。我不確定你的意思是「內聯可以做什麼」 – kosa

+0

內聯是如果它可以在同一行代碼中完成,而不必創建新的引用。 – Wheeler

2

如果calcPay支持所有Employee s,則應該在Employee一個抽象的方法,這將讓你怎麼稱呼它,而不必在所有垂頭喪氣。

+0

+1在我看來,這是最好的方法。它不需要額外的「檢查和鑄造實例」。它充分利用OOP並且速度更快(儘管對於這個例子可能不明顯)。 –

+0

@AndrewCampbell - 感謝您的意見 - 非常感謝。 – Wheeler

+0

@LouisWasserman - 謝謝你。 – Wheeler