我有以下UML图:
我已经读过抽象方法应该被子类覆盖。当两个子类中都没有calculateMonthlyPay()
时,我应该如何覆盖calculateMonthlyPay()
?我可以创建UML图中没有显示的方法吗?
以下是我的Employee
及其子类PartTimeEmp
和FullTimeEmp
的代码供参考。
public abstract class Employee {
Scanner keyboard = new Scanner(System.in);
public String name;
public String ID;
//Employee constructor
public Employee(String name, String ID) {
this.name = name;
this.ID = ID;
}
//ID setter
public void setID(String ID) {
ID = keyboard.nextLine();
this.ID = ID;
}
//name getter
public String getName() {
return name;
}
public abstract String getStatus();
public abstract double calculateMonthlyPay();
@Override
public String toString() {
return "Employee{" + "name=" + name + ", ID=" + ID + '}';
}
}
class PartTimeEmp extends Employee {
public double hourlyRate;
public int hoursPerWeek;
//PartTimeEmp constructor
public PartTimeEmp(String name, String ID){
super(name, ID);
}
public void setHours(int hoursPerWeek) {
this.hoursPerWeek = hoursPerWeek;
}
public void setRate(double hourlyRate) {
this.hourlyRate = hourlyRate;
}
@Override
public String toString() {
return "PartTimeEmp{" + "hourlyRate=" + hourlyRate + ", hoursPerWeek=" + hoursPerWeek + '}';
}
}
class FullTimeEmp extends Employee {
double salary;
//FullTimeEmp constructor
public FullTimeEmp(String name, String ID) {
super(name, ID);
}
//Set salary of employee
public void setSalary(double salary) {
this.salary = salary;
}
@Override
public String toString() {
return "FullTimeEmp{" + "salary=" + salary + '}';
}
}
答案 0 :(得分:1)
UML图仅在首次引入它的类中显示每个方法。否则,每个类的UML将显示其层次结构的所有祖先类的所有方法,这不是很方便。
所以你绝对应该在子类中覆盖calculateMonthlyPay()
和getStatus()
,否则你将无法编译代码。
答案 1 :(得分:1)
由于PartTimeEmp
个实例是Employee
的实例,因此这些实例必须定义Employee
中定义的所有方法。
由于UML不用于定义这些实现细节,因此方法的实现可以在Employee
或实例所属的任何子类中。但它必须存在。
答案 2 :(得分:1)
如果要实现从抽象类扩展的具体类,你有来实现所有抽象方法。
如果你不能改变抽象类(修改签名等),那么只剩下你的选项是实现if。
class PartTimeEmp extends Employee {
public double hourlyRate;
public int hoursPerWeek;
//PartTimeEmp constructor
public PartTimeEmp(String name, String ID){
super(name, ID);
}
:
:
public double calculateMonthlyPay() {
// do noting
// if you can change the method *calculateMonthlyPay*, you could have thro' some exception here
return 0;
}