Sie könnten also implements Employee, Student
intern sowohl an EmployeeImpl als auch an StudentImpl delegieren, aber auch von einer Implementierungsklasse erben.
Nun ist die Klasse Name EmployedStudent (StudyingEmployee oder BothEmployeeAndStudent nicht) schlägt vor:
class EmployedStudent extends StudentImpl implements Employee {
Employee asEmployee = new EmployeeImpl();
Ja, ein kleines bisschen effizienter als nur auf eine andere Klasse zu delegieren.
Die Use-Case ist jedoch weit davon entfernt realistisch: alle Arten von Kombinationen denkbar mehrere Klassen sind. In diesem Fall ist Ihre Lösung universeller. Wirklich universell, ist ein Lookup-Mechanismus:
public class Person {
public <T> T as(Class<T> klazz) { ... }
}
Person person = ...;
Student asStudent = person.as(Student.class);
if (asStudent != null) {
...
}
Employee asEmployee = person.as(Employee.class);
if (asEmployee != null) {
asEmployee.quitJob();
asEmployee = person.as(Employee.class); // null
}
Das ist ein Lookup-Funktionen ist. Es in der Regel eine umständliche Vererbungshierarchie ersetzen kann, sagen von Fahrzeug, RoadVehicle, SwimmingVehicle (Boot), FlyingVehicle (Flugzeug), WaterAirplane (?), AmphibianTank (?) Von Fähigkeiten Schwimmen mit, Fliegen, Fahren.
Der Unterschied ist die gesamte Entkopplung.
Komposition klingt wie der beste Weg zu mir, in Bezug auf die Wiederverwendung von Code. Ohne Mehrfachvererbung weiß ich nicht, wie Sie den Code von * both * StudentImpl und EmployeeImpl auf andere Weise wiederverwenden würden. – christopher
Ich hätte die Komposition auch gesagt. Sie könnten * EmployeedStudent von einer der Implementierungen ableiten und dann nur die Komposition für die andere verwenden, nehme ich an. Aber ich würde nicht gesagt hat, dass als gerade Zusammensetzung wirklich besser war, es wäre denn eine der Schnittstellen ist mehr „primäre“ als die andere (zum Beispiel, dass die primäre Facette war, dass es ein Mitarbeiter war, mit den Schülern etwas ziemlich zweitrangig). –