Supponiamo di avere questi metodi:
codice:
usaPersona(Persona p) { ... }
usaStudente(Studente s) { ... }
usaLavoratore(Lavoratore l) { ... }
E di avere queste classi:
codice:
class Persona
class MioStudente extends Persona implements Studente
class MioLavoratore extends Persona implements Lavoratore
class MioStudenteLavoratore extends Persona implements Studente, Lavoratore
Io posso effettuare le seguenti operazioni:
codice:
Persona p = new Persona();
MioStudente s = new MioStudente();
MioLavoratore l = new MioLavoratore();
MioStudenteLavoratore sl = new MioStudenteLavoratore();
usaPersona( p ); // Valido, ovvio
usaPersona( s ); // Tutte le classi estendono Persona, quindi valido
usaPersona( l ); // Come prima
usaPersona( sl ); // Come prima
usaStudente( s ); // Ok, è uno Studente
usaStudente( sl ); // E' sia uno studente, che un lavoratore, quindi ok
usaLavoratore( l ); // Ok, è un Lavoratore
usaLavoratore( sl ); // E' sia uno studente, che un lavoratore, quindi ok
L'oggetto "sl" lo posso usare in qualunque metodo perchè:
1) E' una persona (extends Persona)
2) E' un lavoratore (implements Lavoratore)
3) E' uno studente (implements Studente)
Con la tua gerarchia, uno StudenteLavoratore deriva solo da Studente (non da Lavoratore), quindi potrei usarlo con "usaStudente()", ma non con "usaLavoratore()".
Ciao.