Java tillåter endast att en klass ärver från en annan klass. Andra programspråk, till exempel C++, tillåter att en klass ärver av flera andra klasser. Med interface-begreppet kan man simulera multipelt arv.
Låt oss betrakta ett exempel:
Vi har två klasser: Student
, Employee
Klassen Student
har en metod getPoäng()
Klassen Employee
har en metod getSalary()
Vad händer om en student också är anställd?
Andra objekt-orienterade språk tillåter multipelt arv: Man kan
definiera en klass StudentEmployee
som ärver från båda:
public class StudentEmployee extends Student, Employee { ... }
Detta kan ej uttryckas i Java. Java tillåter att en klass implementerar flera gränssnitt, men om de olika superklasserna också definierar metoder kan vi inte ärva dem.
Vi ersätter de tidigare klasserna med gränssnitt.
public interface Student { float getGPA (); ... } public interface Empolyee { float getSalary (); ... }
Metod-implementationerna och datastrukturerna flyttas till särskilda implementationsklasser.
public class StudentImpl implements Student { float getGPA () { ... } ... } public class EmployeeImpl implements Empolyee { float getSalary () { ... } ... }
Vi kan nu skapa en klass för dom som är både studenter och anställda genom att utnyttja de gränssnitt och implementationer som vi definierat.
public class StudentEmployee implements Student, Employee { private Student student; private Employee employee; StudentEmployee () { student = new StudentImpl(); employee = new EmployeeImpl(); float getGPA () { return student.getGPA(); } float getSalary () { return employee.getSalary(); } }
I klassen StudentEmployee
implementeras metoden getGPA()
med ett anrop
till motsvarande metod i StudentImpl
.
Att låta en klass på detta sätt låna beteende från en annan klass kallas delegering. Tekniken kan användas i andra sammanhang där man vill låta objekt ur en klass bete sig som om de tillhörde en annan klass.