25
1 Simulated multiple inheritance Sandro Pedrazzini Approfondimento Simulated multiple inheritance in Java

1 Simulated multiple inheritance Sandro Pedrazzini Approfondimento Simulated multiple inheritance in Java

Embed Size (px)

Citation preview

Page 1: 1 Simulated multiple inheritance Sandro Pedrazzini Approfondimento Simulated multiple inheritance in Java

1 Simulated multiple inheritanceSandro Pedrazzini

Approfondimento

Simulated multiple inheritance in Java

Page 2: 1 Simulated multiple inheritance Sandro Pedrazzini Approfondimento Simulated multiple inheritance in Java

2 Simulated multiple inheritanceSandro Pedrazzini

Multiple inheritance in Java

• In Java esiste solo eredità semplice (eredità di implementazione)

• Una classe può però rappresentare più tipi (implementare più interfacce)

• Ogni relazione di ereditarietà può essere ricondotta a delegation

Page 3: 1 Simulated multiple inheritance Sandro Pedrazzini Approfondimento Simulated multiple inheritance in Java

3 Simulated multiple inheritanceSandro Pedrazzini

Classi e tipi

PersistentObjFigura

Triangolo

ElasticObject

public interface PersistentObject { void write(); void read();}

public interface ElasticObject { void enlarge(int offset); void restrict(int offset);}

public class Triangolo extends Figura implements PersistentObject, ElasticObject { ...}

Page 4: 1 Simulated multiple inheritance Sandro Pedrazzini Approfondimento Simulated multiple inheritance in Java

4 Simulated multiple inheritanceSandro Pedrazzini

Delegation

Utilizzo della composizione al posto dell'ereditarietàottenendo lo stesso grado di riutilizzo.

Dalla relazione "is-a" alla relazione "has-a"

Nel caso ideale basterebbe assemblare le varie componentiper realizzare una nuova funzionalità.

FilledBox

Box

FilledBox

Box

move() move()

box.move()

move()

Page 5: 1 Simulated multiple inheritance Sandro Pedrazzini Approfondimento Simulated multiple inheritance in Java

5 Simulated multiple inheritanceSandro Pedrazzini

Problema

• Necessità di estendere contemporaneamente più implementazioni

Person (caratteristiche di una persona)

Employment(dettagli di una persona impiegata)

Employee(caratteristiche complete di un impiegato)

Page 6: 1 Simulated multiple inheritance Sandro Pedrazzini Approfondimento Simulated multiple inheritance in Java

6 Simulated multiple inheritanceSandro Pedrazzini

Person

public class Person { private String fName; private Date fBirthDate;

public Person(String name, Date birthDate) { fName = name; fBirthDate = birthDate; }

public String getName(){ return fName; }

public Date getBirthDate(){ return fBirthDate; }}

Page 7: 1 Simulated multiple inheritance Sandro Pedrazzini Approfondimento Simulated multiple inheritance in Java

7 Simulated multiple inheritanceSandro Pedrazzini

Employment

public class Employment { private float fSalary; private Date fHireDate;

public Employment(float salary, Date hireDate) { fSalary = salary; fHireDate = hireDate; }

public float getSalary() { return fSalary; }

public Date getHireDate() { return fHireDate; }}

Page 8: 1 Simulated multiple inheritance Sandro Pedrazzini Approfondimento Simulated multiple inheritance in Java

8 Simulated multiple inheritanceSandro Pedrazzini

Desiderato

public class Employee extends Person, Employment { ...}

Questo non è però possibile in Java

Soluzione:

- usare delegation per riutilizzare la funzionalità - aggiungere interface per mantenere il polimorfismo

=> Proxy / Decorator

Page 9: 1 Simulated multiple inheritance Sandro Pedrazzini Approfondimento Simulated multiple inheritance in Java

9 Simulated multiple inheritanceSandro Pedrazzini

Extract interfaces (1)

public interface IEmployment { float getSalary(); Date getHireDate();}

public class Employment implements IEmployment { ...}

Page 10: 1 Simulated multiple inheritance Sandro Pedrazzini Approfondimento Simulated multiple inheritance in Java

10 Simulated multiple inheritanceSandro Pedrazzini

Extract interfaces (2)

public interface IPerson { String getName(); Date getBirthDate();}

public class Person implements IPerson { ...}

Page 11: 1 Simulated multiple inheritance Sandro Pedrazzini Approfondimento Simulated multiple inheritance in Java

11 Simulated multiple inheritanceSandro Pedrazzini

Utilizzo delle interface

public class Employee implements IPerson, IEmployment { ...}

• In Java una classe può rappresentare più tipi contemporaneamente

Page 12: 1 Simulated multiple inheritance Sandro Pedrazzini Approfondimento Simulated multiple inheritance in Java

12 Simulated multiple inheritanceSandro Pedrazzini

Utilizzo delle interface (2)

• Utilizzando le interface otteniamo riutilizzo di design

• Come riutilizzare codice?

• Come sfruttare le implementazioni esistenti di Person e Employment?

Page 13: 1 Simulated multiple inheritance Sandro Pedrazzini Approfondimento Simulated multiple inheritance in Java

13 Simulated multiple inheritanceSandro Pedrazzini

Riutilizzo delle classi esistenti

public class Employee extends Person implements IPerson, IEmployment { ...}

oppure:

public class Employee extends Employment implements IPerson, IEmployment { ...}

Page 14: 1 Simulated multiple inheritance Sandro Pedrazzini Approfondimento Simulated multiple inheritance in Java

14 Simulated multiple inheritanceSandro Pedrazzini

Sfruttamento multiplo

• La soluzione proposta permette di sfruttare attraverso ereditarietà solo una delle implementazioni presenti nelle due classi già disponibili (Person oppure Employment)

• Per sfruttare la seconda (o eventualmente anche entrambe) potremmo usare la delegation

• Il polimorfismo è garantito dal fatto di aver implementato le due interfacce

Page 15: 1 Simulated multiple inheritance Sandro Pedrazzini Approfondimento Simulated multiple inheritance in Java

15 Simulated multiple inheritanceSandro Pedrazzini

Sfruttamento multiplo (variante 1)

IPersonPerson

Employee

IEmployment

Employment

Page 16: 1 Simulated multiple inheritance Sandro Pedrazzini Approfondimento Simulated multiple inheritance in Java

16 Simulated multiple inheritanceSandro Pedrazzini

Sfruttamento multiplo (variante 2)

IPerson

Person

Employee

IEmployment

Employment

Page 17: 1 Simulated multiple inheritance Sandro Pedrazzini Approfondimento Simulated multiple inheritance in Java

17 Simulated multiple inheritanceSandro Pedrazzini

Implementazione (variante 1)

public class Employee extends Person implements IPerson, IEmployment {

private IEmployment fEmploymentMixin;

public Employee(String name, Date birthDate, float salary, Date hireDate) { super(name, birthDate); fEmploymentMixin = new Employment(salary, hireDate); }

public float getSalary() { return fEmploymentMixin.getSalary(); }

public Date getHireDate() { return fEmploymentMixin.getHireDate(); }}

Page 18: 1 Simulated multiple inheritance Sandro Pedrazzini Approfondimento Simulated multiple inheritance in Java

18 Simulated multiple inheritanceSandro Pedrazzini

Overriding

• Consideriamo di dover estendere o modificare il comportamento di una classe da cui ereditiamo

• Person (eredità diretta): semplice overriding

• Employment (delegation): internal class + semplice overriding

Page 19: 1 Simulated multiple inheritance Sandro Pedrazzini Approfondimento Simulated multiple inheritance in Java

19 Simulated multiple inheritanceSandro Pedrazzini

Overriding di Person (1)

• Consideriamo di voler garantire l’immutabilità di Employee

• Per far questo dobbiamo modificare il metodo getBirthDate()

• Quello nuovo deve restituirci non il riferimento all’oggetto Date, bensì un nuovo oggetto Date (clone)

Page 20: 1 Simulated multiple inheritance Sandro Pedrazzini Approfondimento Simulated multiple inheritance in Java

20 Simulated multiple inheritanceSandro Pedrazzini

Overriding di Person (2)

public class Employee extends Person implements IPerson, IEmployment { private IEmployment fEmploymentMixin;

public Employee(String name, Date birthDate, float salary, Date hireDate) { super(name, birthDate);

fEmploymentMixin = new Employment(salary, hireDate); }

public float getSalary() { return fEmploymentMixin.getSalary(); }

public Date getHireDate() { return fEmploymentMixin.getHireDate(); }

@Override public Date getBirthDate() { return (Date) super.getBirthDate().clone(); }}

Page 21: 1 Simulated multiple inheritance Sandro Pedrazzini Approfondimento Simulated multiple inheritance in Java

21 Simulated multiple inheritanceSandro Pedrazzini

Overriding di Employment (1)

• Sempre considerando di voler garantire l’immutabilità di Employee, dobbiamo modificare anche il metodo getHireDate()

• Quello nuovo deve restituirci non il riferimento all’oggetto Date, bensì un nuovo oggetto Date (clone)

• getHireDate() è un metodo dell’oggetto delegato

Page 22: 1 Simulated multiple inheritance Sandro Pedrazzini Approfondimento Simulated multiple inheritance in Java

22 Simulated multiple inheritanceSandro Pedrazzini

Overriding di Employment (2)

• Procedimento:

– Creiamo una classe interna EmploymentMixin che erediti da Employment e riscriva il metodo getHireDate()

– Utilizziamo un riferimento ad un oggetto di EmploymentMixin all’interno della classe Employee

Page 23: 1 Simulated multiple inheritance Sandro Pedrazzini Approfondimento Simulated multiple inheritance in Java

23 Simulated multiple inheritanceSandro Pedrazzini

Overriding di Employment (2)

• Classe interna che estende Employment

private static class EmploymentMixin extends Employment {

public EmploymentMixin(float salary, Date hireDate) { super(salary, hireDate); }

@Override public Date getHireDate() { return (Date) super.getHireDate().clone(); } }

Page 24: 1 Simulated multiple inheritance Sandro Pedrazzini Approfondimento Simulated multiple inheritance in Java

24 Simulated multiple inheritanceSandro Pedrazzini

Overriding di Employment (3)

public class Employee extends Person implements IPerson, IEmployment{ private IEmployment fEmploymentMixin;

public Employee(String name, Date birthDate, float salary, Date hireDate) { super(name, birthDate);

fEmploymentMixin = new EmploymentMixin(salary, hireDate); }

...

private static class EmploymentMixin extends Employment { ... }}

Page 25: 1 Simulated multiple inheritance Sandro Pedrazzini Approfondimento Simulated multiple inheritance in Java

25 Simulated multiple inheritanceSandro Pedrazzini

Overriding di Employment (4)

IPersonPerson

Employee

IEmployment

EmploymentMixin

Employment