我有一个小项目,我正在使用继承和多态。我有一个Employee类型的ArrayList,它包含Hourly和Salary员工对象。我希望能够使用for循环在Hourly类中调用calcPay
函数,前提是Employee类型的ArrayList中的对象是Hourly雇员。这条线
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;
}
}
答案 0 :(得分:3)
即使你确定e是每小时类型,你仍然需要强制转换它并使用Hourly
类型来调用calcPay()
因为e是Employee类型而Employee不知道任何{ {1}}方法,因为您已将calcPay()
定义为仅calcPay()
类方法。
Hourly
如果您希望所有Employee实例都可以访问calcPay(),则需要在Employee类中将calcPay()定义为抽象方法,然后您可以避免强制转换。
<强>更新强>
if(e instanceof Hourly)
{
Hourly hourly = (Hourly)e;
System.out.println("Wage: " hourly.calcPay());
}
答案 1 :(得分:2)
如果所有calcPay
都支持Employee
,那么它应该是Employee
中的一个抽象方法,它可以让您无需向下转发即可调用它。