Java:如何使用抽象类

3

我正在尝试使用一个抽象类Employee,它有两个子类:HourlyEmployeeAnnualEmployee。在Employee类中,我有一个抽象方法:

员工类:

public abstract class Employee{
    public abstract double computePay();
}

HourlyEmployee类:

public class HourlyEmployee extends Employee{
    public double computePay(double rate, double hours){
        double monthlySalary;
        monthlySalary = ((rate * hours) * 52) / 12;
        return monthlySalary;
    }
}

AnnualEmployee 类:

public class AnnualEmployee extends Employee{
    public double computePay(double salary){
        double monthlySalary;
        monthlySalary = salary / 12;
        return monthlySalary;
    }
}

错误提示显示,HourlyEmployeeAnnualEmployee都不是抽象类,因此无法覆盖Employee中的抽象方法computePay()

我不明白为什么不能为这个方法提供两个不同的参数。既然我无法这样做,那么该如何解决呢?


假设有人想要处理员工信息,而不关心他当前是HourlyEmployee还是AnnualEmployee或任何其他实现方式。那么这个人想要计算每个员工的薪资,他唯一确定的是该方法看起来像computePay()。当需求发生变化时,如何实现抽象方法? - Tom
@Monil 如果我的帖子对您有所帮助,您可以将其标记为答案吗? - Haifeng Zhang
有没有办法限制全职工人和小时工人的最大工作时间?我们可以在对象实例化时添加条件,但是我们可以在对象定义本身中添加条件吗? - Varun Jain
4个回答

6

你需要在 HourlyEmployeeAnnualEmployee 类中实现 double computePay() 方法,并且方法签名必须和 Employee 类相同。

为了提高代码质量,你可以将 HourlyEmployee 的构造函数声明为:

public HourlyEmployee(double rate, double hours){
    this.rate = rate;
    this.hours = hours;
    ...
}

public double computePay(){
    //use this.rate and this.hours here...
}

当您实例化HourlyEmployee的实例时,可以传递费率和小时数。

Employee hourlyEmployee = new HourlyEmployee(21.5, 7.5);
hourlyEmplyee.computePay();

1
这可能是你想要的东西,我猜。
public abstract class Employee{
  public abstract double computePay();
}

public class HourlyEmployee extends Employee{

    private double rate;
    private double hours;

    @Override
    public double computePay() {
       return ((rate * hours) * 52) / 12;
    }

    public double getHours() {
       return hours;
    }

    public void setHours(double hours) {
       this.hours = hours;
    }

    public double getRate() {
       return rate;
    }

    public void setRate(double rate) {
      this.rate = rate;
    }
}

public class AnnualEmployee extends Employee {

   private double salary;

   public AnnualEmployee(double salary) {
       this.salary = salary;
   }

   @Override
    public double computePay() {
       return salary / 12;
   }

    public double getSalary() {
       return salary;
   }

    public void setSalary(double salary) {
       this.salary = salary;
    }
}

1
你需要完全尊重抽象方法的签名。这里的关键词是方法重载,它是面向对象编程的支柱之一。

0

你必须在子类中@Override computePay() 方法,并且签名(即返回类型的参数)必须与 Employee 类型相匹配。然后,您可以提供使用不同签名的其他版本的 computePay(),但是您必须至少有一个没有参数的版本(因为这是您在 Employee 类中声明为抽象的)。关于抽象类的优秀教程可在 Cave of Programming 上找到。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接