SlideShare a Scribd company logo
1 of 31
Download to read offline
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.
•I   Dipendenti ed i Collaboratori sono sottotipi dei Lavoratori.

                                              Collaboratori Antea
               Dipendenti Antea




           Lavoratori Antea
GERARCHIE DI TIPI
• Caratteristiche   di tutti i Lavoratori: nome, cognome, hanno
 ferie.	


• Caratteristiche   dei Collaboratori: partita IVA.	


• Caratteristiche   dei Dipendenti: codice INAIL.

                             Lavoratore


             Collaboratore                   Dipendente
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.	


• UnCollaboratore può essere usato come se fosse un
 Lavoratore.
TIPO RUNTIME E TIPO
              DICHIARATO

• Ognivariabile è 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.	


• IlLavoratore 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              Contratto                Fornitore
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!

More Related Content

Viewers also liked (9)

Box Functionalities 0.20
Box Functionalities 0.20Box Functionalities 0.20
Box Functionalities 0.20
 
06 Refactoring
06 Refactoring06 Refactoring
06 Refactoring
 
11 Java 7
11 Java 711 Java 7
11 Java 7
 
14 - Atom
14 - Atom14 - Atom
14 - Atom
 
10 Data caching
10 Data caching10 Data caching
10 Data caching
 
Vaadin7
Vaadin7Vaadin7
Vaadin7
 
Tile server
Tile serverTile server
Tile server
 
03 - Ricorsione
03 - Ricorsione03 - Ricorsione
03 - Ricorsione
 
12 java modifiers
12 java modifiers12 java modifiers
12 java modifiers
 

Similar to 01 - Ereditarietà e polimorfismo

"Non Aprite Quella Unit!" ovvero "Scrivere Clean Code in Delphi
"Non Aprite Quella Unit!" ovvero "Scrivere Clean Code in Delphi"Non Aprite Quella Unit!" ovvero "Scrivere Clean Code in Delphi
"Non Aprite Quella Unit!" ovvero "Scrivere Clean Code in DelphiMarco Breveglieri
 
May 2010 - Hibernate search
May 2010 - Hibernate searchMay 2010 - Hibernate search
May 2010 - Hibernate searchJBug Italy
 
Corso Python Deltapromo lezione 1
Corso Python Deltapromo   lezione 1Corso Python Deltapromo   lezione 1
Corso Python Deltapromo lezione 1Paolo Ferretti
 
Sencha touch: panoramica e orientamento sul codice
Sencha touch: panoramica e orientamento sul codiceSencha touch: panoramica e orientamento sul codice
Sencha touch: panoramica e orientamento sul codiceGiuseppe Toto
 
LINQ, Entities Framework & ORMs
LINQ, Entities Framework & ORMsLINQ, Entities Framework & ORMs
LINQ, Entities Framework & ORMsJUG Genova
 
Al telefono con Adhearsion e Ruby
Al telefono con Adhearsion e RubyAl telefono con Adhearsion e Ruby
Al telefono con Adhearsion e RubyLuca Pradovera
 
Sencha touch: Sviluppare un'app - 4° parte
Sencha touch: Sviluppare un'app - 4° parteSencha touch: Sviluppare un'app - 4° parte
Sencha touch: Sviluppare un'app - 4° parteGiuseppe Toto
 

Similar to 01 - Ereditarietà e polimorfismo (16)

iOS_Course_5
iOS_Course_5iOS_Course_5
iOS_Course_5
 
"Non Aprite Quella Unit!" ovvero "Scrivere Clean Code in Delphi
"Non Aprite Quella Unit!" ovvero "Scrivere Clean Code in Delphi"Non Aprite Quella Unit!" ovvero "Scrivere Clean Code in Delphi
"Non Aprite Quella Unit!" ovvero "Scrivere Clean Code in Delphi
 
Hibernatesearch
HibernatesearchHibernatesearch
Hibernatesearch
 
May 2010 - Hibernate search
May 2010 - Hibernate searchMay 2010 - Hibernate search
May 2010 - Hibernate search
 
Corso Python Deltapromo lezione 1
Corso Python Deltapromo   lezione 1Corso Python Deltapromo   lezione 1
Corso Python Deltapromo lezione 1
 
Applicazioni native in java
Applicazioni native in javaApplicazioni native in java
Applicazioni native in java
 
Eccezioni in java
Eccezioni in javaEccezioni in java
Eccezioni in java
 
Sencha touch: panoramica e orientamento sul codice
Sencha touch: panoramica e orientamento sul codiceSencha touch: panoramica e orientamento sul codice
Sencha touch: panoramica e orientamento sul codice
 
Dal C a Java (1/3)
Dal C a Java (1/3)Dal C a Java (1/3)
Dal C a Java (1/3)
 
Variabili
VariabiliVariabili
Variabili
 
Java codestyle & tipstricks
Java codestyle & tipstricksJava codestyle & tipstricks
Java codestyle & tipstricks
 
LINQ, Entities Framework & ORMs
LINQ, Entities Framework & ORMsLINQ, Entities Framework & ORMs
LINQ, Entities Framework & ORMs
 
Al telefono con Adhearsion e Ruby
Al telefono con Adhearsion e RubyAl telefono con Adhearsion e Ruby
Al telefono con Adhearsion e Ruby
 
Mini Corso Java - Parte 1
Mini Corso Java - Parte 1Mini Corso Java - Parte 1
Mini Corso Java - Parte 1
 
Sencha touch: Sviluppare un'app - 4° parte
Sencha touch: Sviluppare un'app - 4° parteSencha touch: Sviluppare un'app - 4° parte
Sencha touch: Sviluppare un'app - 4° parte
 
Programming iOS lezione 4
Programming iOS lezione 4Programming iOS lezione 4
Programming iOS lezione 4
 

More from Federico Russo

More from Federico Russo (11)

23 Sicurezza in BBox
23 Sicurezza in BBox23 Sicurezza in BBox
23 Sicurezza in BBox
 
21 Buzzwords
21 Buzzwords21 Buzzwords
21 Buzzwords
 
18 - InfluxDB
18 - InfluxDB18 - InfluxDB
18 - InfluxDB
 
19 - The Highlander Project
19 - The Highlander Project19 - The Highlander Project
19 - The Highlander Project
 
22 - Better Coding
22 - Better Coding22 - Better Coding
22 - Better Coding
 
20 - Ottimizzare le query
20 - Ottimizzare le query20 - Ottimizzare le query
20 - Ottimizzare le query
 
17 - Web Application Threats
17 - Web Application Threats17 - Web Application Threats
17 - Web Application Threats
 
16 - Project Lombok
16 - Project Lombok16 - Project Lombok
16 - Project Lombok
 
15 - Java 8
15 - Java 815 - Java 8
15 - Java 8
 
04-JVM
04-JVM04-JVM
04-JVM
 
DataSnap
DataSnapDataSnap
DataSnap
 

01 - Ereditarietà e polimorfismo

  • 3. TIPI • Una classe definisce un insieme di oggetti (un tipo), che hanno delle caratteristiche in comune. Lavoratori Antea
  • 4. SOTTOTIPI • Alcuni di questi oggetti hanno caratteristiche distinte. •I Dipendenti ed i Collaboratori sono sottotipi dei Lavoratori. Collaboratori Antea Dipendenti Antea Lavoratori Antea
  • 5. GERARCHIE DI TIPI • Caratteristiche di tutti i Lavoratori: nome, cognome, hanno ferie. • Caratteristiche dei Collaboratori: partita IVA. • Caratteristiche dei Dipendenti: codice INAIL. Lavoratore Collaboratore Dipendente
  • 6. 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.");! }! }
  • 7. 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;
  • 8. 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);! }! }
  • 9. 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;
  • 10. 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);! }! }
  • 11. 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;
  • 12. ABBIAMO VISTO • Aggiunta di informazioni alla superclasse. • Istanziazione di sottoclassi. • Reimplementazione di metodi.
  • 14. POLIMORFISMO •È la capacità di un oggetto di tipo A di apparire e di essere usato come se fosse di tipo B. • UnCollaboratore può essere usato come se fosse un Lavoratore.
  • 15. TIPO RUNTIME E TIPO DICHIARATO • Ognivariabile è 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");
  • 16. INVOCAZIONE DI METODI REIMPLEMENTATI • Che succede invocando: Delphi: Paolo.HaveHolidays() Java: paolo.haveHolidays()
  • 17. 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;!
  • 18. INVOCAZIONE DI METODI REIMPLEMENTATI • Che succede invocando: Delphi: Paolo.Iva; Java: paolo.getIva();
  • 19. ABBIAMO VISTO • Tipo dichiarato e tipo runtime. • Metodi virtuali.
  • 21. PROBLEMA • Il Lavoratore non può prendere ferie perché non ha un contratto. • IlLavoratore non inquadrato non deve esistere, l'idea di Lavoratore anomalo non deve esistere.
  • 22. 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();! }
  • 23. 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;
  • 24. IL LAVORATORE ASTRATTO • Cosa succede invocando: Delphi: TWorker.Create(...)! Java: new Worker(...)
  • 25. ABBIAMO VISTO • Classi astratte. • Metodi astratti.
  • 27. 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 Contratto Fornitore
  • 28. 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;
  • 29. public class Moka implements CoffeeMaker {! @Override! public void loadRawCoffee(int howMuch) {! ...! }! ! @Override! public Coffee makeCoffee() {! ...! }! }
  • 30. 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;
  • 31. DOMANDE? Prossima puntata: Strutture dati e Collezioni. Stay tuned!