Я хочу реализовать следующее многократное наследование:
(взято с 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. Как это исправить?
благодаря
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();
}
}
Целесообразно определить интерфейс для каждого класса, который вы кодируете, чтобы этот подход можно было использовать в будущем.
Предполагая, что все сотрудники - люди (если вы не нанимаете обезьян!), Не могли бы вы не связать классы?
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 {
}
Exception
, чтобы сделать ваши блоки try/catch
более подробными и не анализировать сообщения об ошибках. Я согласен, что в большинстве других случаев вам не нужен дополнительный класс, если определение пустое. Это имело бы больше смысла в языке с множественным наследованием, поэтому вы можете создать класс из миксинов. Это также имеет смысл для abstract
класса, поскольку вы просто создаете некоторый базовый набор API.