Java: 如何使用摘要class

Java: How to use Abstract class

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

员工Class:

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

小时工Class:

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

年度雇员Class:

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

错误说 HourlyEmployeeAnnualEmployee 都不是抽象的,因此不能覆盖 Employee 中的抽象方法 computePay()

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

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

您必须在 class HourlyEmployeeAnnualEmployee 中实施 double computePay()。必须保持方法签名与 class 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();

我猜这就是你想要的东西

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;
    }
}

您必须 @Override 您的子 class 中的 computePay() 方法,并且签名(即 return 类型的参数)必须与Employee 类型。然后,您可以提供使用不同签名的 computePay() 的其他版本,但您至少必须有一个没有参数的版本(因为这是您在 Employee class 中声明为抽象的版本). Cave of Programming.

提供了关于抽象 classes 的精彩教程