01 - ereditarietà e polimorfismo

31
EREDITARIETÀ E POLIMORFISMO Talk 1

Upload: federico-russo

Post on 17-May-2015

247 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 01 - Ereditarietà e polimorfismo

EREDITARIETÀ E POLIMORFISMO

Talk 1

Page 2: 01 - Ereditarietà e polimorfismo

EREDITARIETÀ!

Page 3: 01 - Ereditarietà e polimorfismo

TIPI• Una classe definisce un insieme di oggetti (un tipo), che hanno delle caratteristiche in comune.

Lavoratori Antea

Page 4: 01 - Ereditarietà e polimorfismo

SOTTOTIPI• Alcuni di questi oggetti hanno caratteristiche distinte.

Lavoratori Antea

Dipendenti AnteaCollaboratori Antea

• I Dipendenti ed i Collaboratori sono sottotipi dei Lavoratori.

Page 5: 01 - Ereditarietà e polimorfismo

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

Page 6: 01 - Ereditarietà e polimorfismo

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.");!

}!

}

Page 7: 01 - Ereditarietà e polimorfismo

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;

Page 8: 01 - Ereditarietà e polimorfismo

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);!

}!

}

Page 9: 01 - Ereditarietà e polimorfismo

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;

Page 10: 01 - Ereditarietà e polimorfismo

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);!

}!

}

Page 11: 01 - Ereditarietà e polimorfismo

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;

Page 12: 01 - Ereditarietà e polimorfismo

ABBIAMO VISTO

• Aggiunta di informazioni alla superclasse.

• Istanziazione di sottoclassi.

• Reimplementazione di metodi.

Page 13: 01 - Ereditarietà e polimorfismo

POLIMORFISMO

Page 14: 01 - Ereditarietà e 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.

Page 15: 01 - Ereditarietà e polimorfismo

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");

Page 16: 01 - Ereditarietà e polimorfismo

INVOCAZIONE DI METODI REIMPLEMENTATI

• Che succede invocando:

Delphi: Paolo.HaveHolidays()

Java: paolo.haveHolidays()

Page 17: 01 - Ereditarietà e polimorfismo

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;!

Page 18: 01 - Ereditarietà e polimorfismo

INVOCAZIONE DI METODI REIMPLEMENTATI

• Che succede invocando:

Delphi: Paolo.Iva;

Java: paolo.getIva();

Page 19: 01 - Ereditarietà e polimorfismo

ABBIAMO VISTO

• Tipo dichiarato e tipo runtime.

• Metodi virtuali.

Page 20: 01 - Ereditarietà e polimorfismo

CLASSI ASTRATTE

Page 21: 01 - Ereditarietà e polimorfismo

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.

Page 22: 01 - Ereditarietà e polimorfismo

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

}

Page 23: 01 - Ereditarietà e polimorfismo

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;

Page 24: 01 - Ereditarietà e polimorfismo

IL LAVORATORE ASTRATTO

• Cosa succede invocando:

Delphi: TWorker.Create(...)!

Java: new Worker(...)

Page 25: 01 - Ereditarietà e polimorfismo

ABBIAMO VISTO

• Classi astratte.

• Metodi astratti.

Page 26: 01 - Ereditarietà e polimorfismo

INTERFACCE

Page 27: 01 - Ereditarietà e polimorfismo

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

Page 28: 01 - Ereditarietà e polimorfismo

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;

Page 29: 01 - Ereditarietà e polimorfismo

public class Moka implements CoffeeMaker {!

@Override!

public void loadRawCoffee(int howMuch) {!

...!

}!

!

@Override!

public Coffee makeCoffee() {!

...!

}!

}

Page 30: 01 - Ereditarietà e polimorfismo

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;

Page 31: 01 - Ereditarietà e polimorfismo

DOMANDE?

Prossima puntata: Strutture dati e Collezioni. Stay tuned!