如何将这个多重继承转换为Java中的接口?

时间:2014-06-01 21:38:20

标签: java c++ inheritance interface

我想实现以下多重继承的情况:

(取自http://www.learncpp.com/cpp-tutorial/117-multiple-inheritance/

Person           Employee
   |_________________|
              |
           Nurse

最后我想打印员工和护士的工资。在C ++中,使用多重继承很容易,但我遇到了Java问题。

我有以下代码:

public class Person{
    protected String name;
    protected int age;
    public Person(String name,int age){
        this.name=name;
        this.age=age;
    }
}

和界面:

public interface Employee{
    public double getSalary();
}

和护士班:

public class Nurse extends Person implements Employee{
    private double salary;
    public Nurse(String name, int age, double salary){
        super(name,age);
        this.salary=salary;
    }
    @Override
    public double getSalary(){
        return salary;
    }
}

但我不知道如何让Employee打印其薪水,因为它是一个界面。我不想使用其他名为Employee的抽象类。如何解决这个问题?

由于

2 个答案:

答案 0 :(得分:3)

假设所有员工都是人(除非你雇佣猴子!!),你能否把课程连在一起?

public class Person {
    private String name;
    private int age;

    public Person(String name,int age){
        this.name = name;
        this.age = age;
    }
}

public class Employee extends Person {
    private double salary;

    public double getSalary(){
        return salary;
    }
}

public class Nurse extends Employee {
}

答案 1 :(得分:1)

Java只允许接口的多重继承,因此为了实现这一点,您必须为每个类定义一个接口,您希望通过委派从部分接口派生的所有方法来组合它们并将它们组合在一个类中他们的实施。

人员界面 - 正如您所定义的那样

PersonImpl类

public final class PersonImpl implements Person {
    private final String name;
    private final int age;

    public PersonImpl(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String getName() {
        return name;
    }

    @Override
    public int getAge() {
        return age;
    }
}

EmployeeImpl类

public final class EmployeeImpl implements Employee {
    private final double salary;

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

    @Override
    public double getSalary() {
        return salary;
    }
}

护士班 - 由其他类组成,并将功能委托给他们:

public class Nurse implements Employee, Person {

    private final Employee employee;
    private final Person person;

    public Nurse(String name, int age, double salary) {
        person = new PersonImpl(name, age);
        employee = new EmployeeImpl(salary);
    }

    @Override
    public double getSalary() {
        return employee.getSalary();
    }

    @Override
    public String getName() {
        return person.getName();
    }

    @Override
    public int getAge() {
        return person.getAge();
    }
}

建议为您编写的每个类定义一个接口,以便将来能够采用这种方法。