01 - ereditarietà e polimorfismo

Post on 17-May-2015

247 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

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!

top related