Multipelt arv och delegering

Sven-Olof Nyström
OOP med Java våren -25
Informationsteknologi
Uppsala Universitet

Interface för att simulera multipelt arv

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?

Med multipelt arv

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.

Lösning i Java:

1. Definiera gränssnitt

Vi ersätter de tidigare klasserna med gränssnitt.

public interface Student {
    float getGPA ();
    ...
}

public interface Empolyee {
    float getSalary ();
    ...
}

2. Implementera ...

Metod-implementationerna och datastrukturerna flyttas till särskilda implementationsklasser.

public class StudentImpl implements Student {
    float getGPA () { ... }
    ...
}

public class EmployeeImpl implements Empolyee {
    float getSalary () { ... }
    ...
}

3. En klass StudentEmployee

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

Delegering

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.