Как преобразовать это множественное наследование для интерфейсов в Java?

0

Я хочу реализовать следующее многократное наследование:

(взято с http://www.learncpp.com/cpp-tutorial/117-multiple-inheritance/)

Person           Employee
   |_________________|
              |
           Nurse

в конце я хочу напечатать зарплату от Employee and 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. Как это исправить?

благодаря

  • 0
    Java не поддерживает множественное наследование или делает это ... ???
  • 0
    нет, но он может симулировать это с помощью интерфейсов
Показать ещё 8 комментариев
Теги:
inheritance
interface

2 ответа

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

Целесообразно определить интерфейс для каждого класса, который вы кодируете, чтобы этот подход можно было использовать в будущем.

  • 0
    Нет, пожалуйста, не делай этого. Это не наследование, потому что вы должны предоставить определение каждого метода внутри каждого класса, который его использует. Весь смысл наследования заключается в том, что экземпляр типа X «является» экземпляром типа Y и поэтому получает все методы типа Y без необходимости переопределять их.
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 {
}
  • 0
    Я никогда не получал решения Oracle разрешить классам расширяться или расширяться таким образом, чтобы определение не содержало абсолютно ничего и было просто указателем типа или тега.
  • 1
    @Casey, который на самом деле может быть полезен для классов Exception , чтобы сделать ваши блоки try/catch более подробными и не анализировать сообщения об ошибках. Я согласен, что в большинстве других случаев вам не нужен дополнительный класс, если определение пустое. Это имело бы больше смысла в языке с множественным наследованием, поэтому вы можете создать класс из миксинов. Это также имеет смысл для abstract класса, поскольку вы просто создаете некоторый базовый набор API.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню