Java:对于仅在UML图中的超类中的抽象方法应该怎么做?

时间:2014-08-03 17:10:04

标签: java inheritance abstract

我有以下UML图:Class Diagram 我已经读过抽象方法应该被子类覆盖。当两个子类中都没有calculateMonthlyPay()时,我应该如何覆盖calculateMonthlyPay()?我可以创建UML图中没有显示的方法吗?

以下是我的Employee及其子类PartTimeEmpFullTimeEmp的代码供参考。

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

3 个答案:

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