Java: 如何使用摘要class
Java: How to use Abstract class
我正在尝试使用摘要 class Employee
,它有两个子 class,HourlyEmployee
和 AnnualEmployee
。在 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;
}
}
错误说 HourlyEmployee
和 AnnualEmployee
都不是抽象的,因此不能覆盖 Employee
中的抽象方法 computePay()
。
我不明白为什么我不能为这个方法提供两个不同的参数。既然我做不到,那我应该怎么解决呢?
你必须完全尊重抽象方法签名。这里的关键词是方法重载,它是面向对象编程的支柱之一。
您必须在 class HourlyEmployee
和 AnnualEmployee
中实施 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 的精彩教程
我正在尝试使用摘要 class Employee
,它有两个子 class,HourlyEmployee
和 AnnualEmployee
。在 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;
}
}
错误说 HourlyEmployee
和 AnnualEmployee
都不是抽象的,因此不能覆盖 Employee
中的抽象方法 computePay()
。
我不明白为什么我不能为这个方法提供两个不同的参数。既然我做不到,那我应该怎么解决呢?
你必须完全尊重抽象方法签名。这里的关键词是方法重载,它是面向对象编程的支柱之一。
您必须在 class HourlyEmployee
和 AnnualEmployee
中实施 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.