3

私は継承とポリモーフィズムに取り組んでいる小さなプロジェクトを持っています。Hourly と Salary の両方の従業員オブジェクトを含む Employee 型の ArrayList があります。calcPayタイプ Employee の ArrayList 内のオブジェクトが Hourly 従業員である場合、for ループを使用して Hourly クラスの関数を呼び出せるようにしたいと考えています。この線

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

エラーが発生しますThe method calcPay() is undefined for type 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;
        }
   }
4

2 に答える 2

2

calcPayがすべての でサポートされている場合Employee、それは の抽象メソッドである必要がありEmployeeます。これにより、ダウンキャストをまったく行うことなく呼び出すことができます。

于 2012-12-07T21:37:37.907 に答える
2

e が Hourly 型であることを確認している場合でも、 e は Employee 型であり、クラス メソッドのみとして定義しているため 、Employee はメソッドを認識していないため、キャストしてHourlytype を使用して呼び出す必要があります。calcPay()calcPay()calcPay()Hourly

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

すべての Employee インスタンスで calcPay() にアクセスできるようにするには、 Employee クラスで calcPay() を抽象メソッドとして定義する必要があります。これにより、キャストを回避できます。

更新しました:

 if(e instanceof Hourly)
              {
                  System.out.println("Wage: " ((Hourly)e).calcPay());
              }
于 2012-12-07T21:35:39.753 に答える