01 - ereditarietà e polimorfismo
TRANSCRIPT
EREDITARIETÀ E POLIMORFISMO
Talk 1
EREDITARIETÀ!
TIPI• Una classe definisce un insieme di oggetti (un tipo), che hanno delle caratteristiche in comune.
Lavoratori Antea
SOTTOTIPI• Alcuni di questi oggetti hanno caratteristiche distinte.
Lavoratori Antea
Dipendenti AnteaCollaboratori Antea
• I Dipendenti ed i Collaboratori sono sottotipi dei Lavoratori.
GERARCHIE DI TIPI• Caratteristiche di tutti i Lavoratori: nome, cognome, hanno ferie.
• Caratteristiche dei Collaboratori: partita IVA.
• Caratteristiche dei Dipendenti: codice INAIL.
Dipendente
Lavoratore
Collaboratore
public class Worker {!
protected String name;!
protected String surname;!
public Worker(String name, String surname){!
this.name = name;!
this.surname = surname;!
}!
public void haveHolidays() {!
System.out.println("Non posso.");!
}!
}
class TWorker {!
protected:!
FName: String;!
FSurname: String;!
public:!
constructor Create(AName, ASurname: String);!
procedure HaveHolidays();!
end;!
TWorker.Create(AName, ASurname: String) begin!
FName := AName;!
FSurname := ASurname;!
end;!
procedure TWorker.HaveHolidays() begin!
writeln("Non posso.");!
end;
public class Contractor extends Worker {!
protected String vatId;!
public Contractor(String name, String surname, String vatId){!
super(name, surname);!
this.vatId = vatId;!
}!
public void haveHolidays() {!
administration.acknowledgeHolidays(since, to);!
}!
}
class TContractor(TWorker) {!
protected:!
FIva: String;!
public:!
constructor Create(AName, ASurname, AIva: String);!
procedure HaveHolidays();!
end;!
TContractor.Create(AName, ASurname, AIva: String) begin!
inherited(AName, ASurname);!
FIva := AIva;!
end;!
procedure TContractor.HaveHolidays() begin!
administration.AckowledgeHolidays(Since, To);!
end;
public class Employee extends Worker {!
protected String inailId;!
public Employee(String name, String surname, String inailId){!
super(name, surname);!
this.inailId = inailId;!
}!
public void haveHolidays() {!
administration.askForHolidays(since, to);!
}!
}
class TEmployee(TWorker) {!
protected:!
FInail: String;!
public:!
constructor Create(AName, ASurname, AInail: String);!
procedure HaveHolidays();!
end;!
TEmployee.Create(AName, ASurname, AInail: String) begin!
inherited(AName, ASurname);!
FInail := AInail;!
end;!
procedure TEmployee.HaveHolidays() begin!
administration.AskForHolidays(Since, To);!
end;
ABBIAMO VISTO
• Aggiunta di informazioni alla superclasse.
• Istanziazione di sottoclassi.
• Reimplementazione di metodi.
POLIMORFISMO
POLIMORFISMO
• È la capacità di un oggetto di tipo A di apparire e di essere usato come se fosse di tipo B.
• Un Collaboratore può essere usato come se fosse un Lavoratore.
TIPO RUNTIME E TIPO DICHIARATO
• Ogni variabile è dichiarata di un certo tipo, ma il valore che ha dentro può un oggetto di un altro tipo (lo stesso oppure un suo sottotipo).
TWorker Paolo := TContractor.Create('Paolo', 'Bocchini', '0123456789');!
Worker paolo = new Contractor("Paolo", "Bocchini", "0123456789");
INVOCAZIONE DI METODI REIMPLEMENTATI
• Che succede invocando:
Delphi: Paolo.HaveHolidays()
Java: paolo.haveHolidays()
class TWorker {!
protected:!
FName: String;!
FSurname: String;!
public:!
constructor Create(AName, ASurname: String);!
procedure HaveHolidays(); virtual;!
end;!
!class TContractor(TWorker) {!
protected:!
FIva: String;!
public:!
constructor Create(AName, ASurname, AIva: String);!
procedure HaveHolidays(); override;!
end;!
INVOCAZIONE DI METODI REIMPLEMENTATI
• Che succede invocando:
Delphi: Paolo.Iva;
Java: paolo.getIva();
ABBIAMO VISTO
• Tipo dichiarato e tipo runtime.
• Metodi virtuali.
CLASSI ASTRATTE
PROBLEMA
• Il Lavoratore non può prendere ferie perché non ha un contratto.
• Il Lavoratore non inquadrato non deve esistere, l'idea di Lavoratore anomalo non deve esistere.
public abstract class Worker {!
protected String name;!
protected String surname;!
public Worker(String name, String surname){!
this.name = name;!
this.surname = surname;!
}!
public abstract void haveHolidays();!
}
class TWorker {!
protected:!
FName: String;!
FSurname: String;!
public:!
constructor Create(AName, ASurname: String);!
procedure HaveHolidays(); virtual; abstract;!
end;!
TWorker.Create(AName, ASurname: String) begin!
FName := AName;!
FSurname := ASurname;!
end;
IL LAVORATORE ASTRATTO
• Cosa succede invocando:
Delphi: TWorker.Create(...)!
Java: new Worker(...)
ABBIAMO VISTO
• Classi astratte.
• Metodi astratti.
INTERFACCE
CLASSI MOLTO ASTRATTE• Vogliamo un costrutto che ci permetta di separare la descrizione di un comportamento e il modo in cui viene realizzato.
• Un Contratto che permetta alle due parti di ignorare il modo in cui l'altra fa le cose.
Cliente FornitoreContratto
UN'INTERFACCIA• È un costrutto che elenca dei metodi, ma non li implementa.
public interface CoffeeMaker {! void loadRawCoffee(int howMuch);! Coffee makeCoffee();!}!!!interface ICoffeeMaker;! procedure LoadRawCoffee(AHowMuch: Integer);! function MakeCoffee: ICoffee;!end;
public class Moka implements CoffeeMaker {!
@Override!
public void loadRawCoffee(int howMuch) {!
...!
}!
!
@Override!
public Coffee makeCoffee() {!
...!
}!
}
class TMoka(TInterfacedObject, ICoffeeMaker);!
public:!
procedure LoadRawCoffee(AHowMuch: Integer); override;!
function MakeCoffee: ICoffee; override;!
end;!
!
procedure TMoka.LoadRawCoffee(AHowMuch: Integer); begin;!
...!
end;!
function TMoka.MakeCoffee: ICoffee; begin;!
...!
end;
DOMANDE?
Prossima puntata: Strutture dati e Collezioni. Stay tuned!