programmazione orientata agli oggetti in linguaggio...

14
G. Mecca – Università della Basilicata – [email protected] Programmazione Orientata agli Oggetti in Linguaggio Java Sintassi e Semantica: Introduzione all’Ereditarietà versione 2.1 Questo lavoro è concesso in uso secondo i termini di una licenza Creative Commons (vedi ultima pagina) 2 G. Mecca - Programmazione Orientata agli Oggetti Sommario m Introduzione m Perchè Esiste l’Ereditarietà m Regole Meccaniche m La Classe Object Sintassi e Semantica: Introduzione all’Ereditarietà >> Sommario

Upload: others

Post on 13-Aug-2020

4 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Programmazione Orientata agli Oggetti in Linguaggio Javadb.unibas.it/users/mecca/corsi/2004-2005/progOggettiI/materiale/Me… · La Classe Object mNei linguaggi moderni (Java, C#)

10/05/2005

1

G. Mecca – Università della Basilicata – [email protected]

Programmazione Orientataagli Oggetti in Linguaggio Java

Sintassi e Semantica:Introduzione all’Ereditarietà

versione 2.1Questo lavoro è concesso in uso secondo i termini di una licenza Creative Commons

(vedi ultima pagina)

2G. Mecca - Programmazione Orientata agli Oggetti

Sommario

m IntroduzionemPerchè Esiste l’EreditarietàmRegole Meccanichem La Classe Object

Sintassi e Semantica: Introduzione all’Ereditarietà >> Sommario

Page 2: Programmazione Orientata agli Oggetti in Linguaggio Javadb.unibas.it/users/mecca/corsi/2004-2005/progOggettiI/materiale/Me… · La Classe Object mNei linguaggi moderni (Java, C#)

10/05/2005

2

3G. Mecca - Programmazione Orientata agli Oggetti

Introduzione

mUna delle caratteristiche dei linguaggi ooðle classi possono “estendere” altre classiðda cui “ereditano” le caratteristiche

mEreditarietàðmeccanismo importante del linguaggioðne parliamo sommariamente perchè è una

caratteristica della prog. orientata agli oggettiðper ora ci interessa solo dare alcune regole

meccaniche (>>)

Sintassi e Semantica: Introduzione all'Ereditarietà >> Introduzione

ATTENZIONEall’approccio alla

descrizione dell’ereditarietà

4G. Mecca - Programmazione Orientata agli Oggetti

Perché Esiste l'Ereditarietà

mPerché questi meccanismi ?ðperchè rispecchiano aspetti della realtà

m Infatti ðgli oggetti software sono fatti per

rappresentare oggetti del mondo realeðe tra oggetti del mondo reale si stabiliscono

frequentemente relazioni di simili a quelle descritte

Sintassi e Semantica: Introduzione all’Ereditarietà >> Perché Esiste

Page 3: Programmazione Orientata agli Oggetti in Linguaggio Javadb.unibas.it/users/mecca/corsi/2004-2005/progOggettiI/materiale/Me… · La Classe Object mNei linguaggi moderni (Java, C#)

10/05/2005

3

5G. Mecca - Programmazione Orientata agli Oggetti

Perché Esiste l'Ereditarietà

m Le relazioni nel mondo realeði concetti del mondo reale sono spesso

organizzati in “tassonomie”ðuna tassonomia è una rappresentazione di

concetti – ovvero classi di oggetti – in cui ci sono concetti più generali e concetti più specifici

mUn esempio tipicoðla biologia

Sintassi e Semantica: Introduzione all’Ereditarietà >> Perché Esiste

6G. Mecca - Programmazione Orientata agli Oggetti

Esempio di Tassonomia

Sintassi e Semantica: Introduzione all’Ereditarietà >> Perché Esiste

animale

mammifero pesce uccello anfibio

cavallo uomo

specie vivente

vegetale...

...

NOTA- tutti gli esemplari della tassonomiahanno un’età- tutti gli esemplari della tassonomiasono esseri viventi

Page 4: Programmazione Orientata agli Oggetti in Linguaggio Javadb.unibas.it/users/mecca/corsi/2004-2005/progOggettiI/materiale/Me… · La Classe Object mNei linguaggi moderni (Java, C#)

10/05/2005

4

7G. Mecca - Programmazione Orientata agli Oggetti

Perché Esiste l'Ereditarietà

mSupponiamo ðdi dover rappresentare oggetti della

tassonomia in un’applicazionem I requisito utileðvorrei definire una classe EssereVivente con

la proprietà eta ed il metodo getEta()ðe poi definire tutte le altre classi senza dover

replicare la proprietà eta ed il metodo getEta()

Sintassi e Semantica: Introduzione all’Ereditarietà >> Perché Esiste

8G. Mecca - Programmazione Orientata agli Oggetti

Perché Esiste l'Ereditarietà

m II requisito utileðsarebbe utile se – dovendo, ad esempio,

sviluppare un’applicazione su uno zoo –potessi mettere assieme in una collezione (es: array) riferimenti ad animali variðtrattandoli semplicemente come Animali ðes: Animale a = new Uccello();ðes: Animale b = new Cavallo();

Sintassi e Semantica: Introduzione all’Ereditarietà >> Perché Esiste

Page 5: Programmazione Orientata agli Oggetti in Linguaggio Javadb.unibas.it/users/mecca/corsi/2004-2005/progOggettiI/materiale/Me… · La Classe Object mNei linguaggi moderni (Java, C#)

10/05/2005

5

9G. Mecca - Programmazione Orientata agli Oggetti

Perché Esiste l'Ereditarietà

m L’ereditarietà ðesiste nei linguaggi di programmazione per

poter soddisfare questi due requisitim Ideaðsi definiscono le “superclassi” che

rappresentano i concetti più in alto nella tassonomiaðsi definiscono le “sottoclassi” estendendo le

superclassi esistenti

Sintassi e Semantica: Introduzione all’Ereditarietà >> Perché Esiste

10G. Mecca - Programmazione Orientata agli Oggetti

Regole Meccaniche

mPer estendere una superclasseðla sottoclasse deve utilizzare la parola chiave

extends

mEsempio

Sintassi e Semantica: Introduzione all’Ereditarietà >> Regole Meccaniche

public class EssereVivente {private int eta;public int getEta() { return this.eta; }public void setEta(int eta) { this.eta = eta; }... }

public class Animale extends EssereVivente {private boolean sangueCaldo;public void setSangueCaldo(boolean b) {this.sangueCaldo = sangueCaldo; } public boolean getSangueCaldo() {return this.sangueCaldo;} ...

}

Page 6: Programmazione Orientata agli Oggetti in Linguaggio Javadb.unibas.it/users/mecca/corsi/2004-2005/progOggettiI/materiale/Me… · La Classe Object mNei linguaggi moderni (Java, C#)

10/05/2005

6

11G. Mecca - Programmazione Orientata agli Oggetti

Regole Meccaniche

Sintassi e Semantica: Introduzione all’Ereditarietà >> Regole Meccaniche

public boolean getSangueCaldo()public void setSangueCaldo(boolean sc)

private boolean sangueCaldo;

Animale

public int getEta()public void setEta(int eta)

private int eta;

EssereVivente

...

private int clorofilla;

Vegetale

... ...

12G. Mecca - Programmazione Orientata agli Oggetti

Regole Meccaniche

m Ipotesiðsupponiamo che una classe F (“figlia”)

estenda una classe P (“padre”)ðin questo caso F si chiama anche

“sottoclasse”, P si chiama anche “superclasse”ðdefiniamo le regole meccaniche secondo cui

deve essere interpretata la semantica dell’estensione

Sintassi e Semantica: Introduzione all'Ereditarietà >> Regole Meccaniche

ATTENZIONEalle regole meccaniche

sull’ereditarietà

Page 7: Programmazione Orientata agli Oggetti in Linguaggio Javadb.unibas.it/users/mecca/corsi/2004-2005/progOggettiI/materiale/Me… · La Classe Object mNei linguaggi moderni (Java, C#)

10/05/2005

7

13G. Mecca - Programmazione Orientata agli Oggetti

Regole Meccaniche

mRegola n. 1: eredità delle caratteristicheðgli oggetti di tipo F ereditano tutte le proprietà

ed i metodi degli oggetti di tipo Pðpossono estenderli aggiungendo ulteriori

proprietà e ulteriori metodiðpossono ridefinire i metodi nel caso in cui i

metodi ereditati non siano adeguatiðNOTA: non vale il viceversa

Sintassi e Semantica: Introduzione all'Ereditarietà >> Regole Meccaniche

14G. Mecca - Programmazione Orientata agli Oggetti

Regole Meccaniche

m In altri terminiðla regola n. 1 dice che posso scrivere

Sintassi e Semantica: Introduzione all'Ereditarietà >> Regole Meccaniche

Animale a = new Animale();a.setSangueCaldo(true);System.out.println(a.getSangueCaldo());a.setEta(5);System.out.println(a.getEta());

EssereVivente e = new EssereVivente();e.setEta(5);System.out.println(e.getEta());e.setSangueCaldo(true);System.out.println(e.getSangueCaldo());

Animale estendeEssereVivente e neeredita i metodi

Attenzione: non valeil viceversa(EssereVivente noneredita i metodi diAnimale)

Page 8: Programmazione Orientata agli Oggetti in Linguaggio Javadb.unibas.it/users/mecca/corsi/2004-2005/progOggettiI/materiale/Me… · La Classe Object mNei linguaggi moderni (Java, C#)

10/05/2005

8

15G. Mecca - Programmazione Orientata agli Oggetti

Regole Meccaniche

Sintassi e Semantica: Introduzione all’Ereditarietà >> Regole Meccaniche

public boolean getSangueCaldo()public void setSangueCaldo(boolean sc)

private boolean sangueCaldo;

Animale

public int getEta()public void setEta(int eta)

private int eta;

EssereVivente

764 : Animale: Principale

1. new Animale()

3. setSangueCaldo(true)

4. setEta(5)

2. creazione

16G. Mecca - Programmazione Orientata agli Oggetti

Regole Meccaniche

mRegola n. 2: sostituibilità del tipoðgli oggetti di tipo F possono essere

considerati anche oggetti di tipo Pðinfatti gli oggetti di tipo F hanno tutte le

caratteristiche degli oggetti di tipo Pðdi conseguenza, gli oggetti di tipo F sono

sostituibili a quelli di tipo P (possono essere utilizzati dove servono gli altri)ðNOTA: non vale il viceversa

Sintassi e Semantica: Introduzione all'Ereditarietà >> Regole Meccaniche

Page 9: Programmazione Orientata agli Oggetti in Linguaggio Javadb.unibas.it/users/mecca/corsi/2004-2005/progOggettiI/materiale/Me… · La Classe Object mNei linguaggi moderni (Java, C#)

10/05/2005

9

17G. Mecca - Programmazione Orientata agli Oggetti

Regole Meccaniche

m In altri terminiðla regola n. 2 dice che posso scrivere

Sintassi e Semantica: Introduzione all'Ereditarietà >> Regole Meccaniche

EssereVivente e = new Animale();e.setEta(5);System.out.println(e.getEta());

Animale a = new EssereVivente();a.setEta(5);System.out.println(a.getEta());

un oggetto di tipoAnimale è accettabileper un riferimento ditipo EssereVivente

Attenzione: non valeil viceversa(EssereVivente nonè accettabile dove serve un animale)

18G. Mecca - Programmazione Orientata agli Oggetti

La Classe Object

mNei linguaggi moderni (Java, C#)ðuna classe può dichiarare di estenderne al

massimo un’altra con extends (“ereditarietà singola”)ðinoltre, se una classe non specifica la

clausola extends, implicitamente estende una classe speciale denominata java.lang.Objectðdi conseguenza, ciascuna classe estende

sempre esattamente una superclasse (o definita esplicitamente oppure Object)

Sintassi e Semantica: Introduzione all'Ereditarietà >> La Classe Object

Page 10: Programmazione Orientata agli Oggetti in Linguaggio Javadb.unibas.it/users/mecca/corsi/2004-2005/progOggettiI/materiale/Me… · La Classe Object mNei linguaggi moderni (Java, C#)

10/05/2005

10

19G. Mecca - Programmazione Orientata agli Oggetti

La Classe Object

m In Javaðtutte le classi estendono automaticamente

java.lang.Object

m java.lang.Objectðvari metodi pubblici

m I principali metodiðboolean equals(Object o)ðString toString()

Sintassi e Semantica: Introduzione all'Ereditarietà >> La Classe Object

>> java.lang.Object

20G. Mecca - Programmazione Orientata agli Oggetti

La Classe Object

Sintassi e Semantica: Introduzione all'Ereditarietà >> La Classe Object

public boolean getSangueCaldo()public void setSangueCaldo(boolean sc)

private boolean sangueCaldo;

Animale

public int getEta()public void setEta(int eta)

private int eta;

EssereVivente

...

private double clorofilla;

Vegetale

... ...

public boolean equals(Object o)public String toString()

java.lang.Object

Page 11: Programmazione Orientata agli Oggetti in Linguaggio Javadb.unibas.it/users/mecca/corsi/2004-2005/progOggettiI/materiale/Me… · La Classe Object mNei linguaggi moderni (Java, C#)

10/05/2005

11

21G. Mecca - Programmazione Orientata agli Oggetti

La Classe Object

mEsempioðcalcolatrice.Circonferenza estende

java.lang.Object

mRegola n. 1: eredità delle caratteristicheðle istanze di Circonferenza ereditano i metodi

delle istanze di object (es: toString())ðes: è possibile scrivere

Circonferenza c = new Circonferenza();System.out.println(c.toString());

Sintassi e Semantica: Introduzione all'Ereditarietà >> La Classe Object

NOTA: data la semanticadel metodo println, basta scrivere:

System.out.println(c);

22G. Mecca - Programmazione Orientata agli Oggetti

La Classe Object

mMa...ðil metodo toString() ereditato da Object è

poco interessante; produce stringhe del tipo Circonferenza@42ba81ðper avere un comportamento più

interessante, gli oggetti di tipo Circonferenza possono ridefinire il metodo in modo da stampare le coordinate del centro e il raggio

Sintassi e Semantica: Introduzione all'Ereditarietà >> La Classe Object

Page 12: Programmazione Orientata agli Oggetti in Linguaggio Javadb.unibas.it/users/mecca/corsi/2004-2005/progOggettiI/materiale/Me… · La Classe Object mNei linguaggi moderni (Java, C#)

10/05/2005

12

23G. Mecca - Programmazione Orientata agli Oggetti

La Classe Object

mEsempio

Sintassi e Semantica: Introduzione all'Ereditarietà >> La Classe Object

public class Circonferenza {...public String toString () {

return “Centro: (“ + this.ascissaCentro + “,” + this.ordinataCentro + “) - ” +

“Raggio: “ + this.raggio;}...

}

24G. Mecca - Programmazione Orientata agli Oggetti

La Classe Object

m In questo casoðgli oggetti di tipo Circonferenza ereditano

toString() dalla superclasse Objectðma lo ridefiniscono e la versione predefinita

prevale su quella ereditata

Sintassi e Semantica: Introduzione all'Ereditarietà >> La Classe Object

Circonferenza c = new Circonferenza();System.out.println(c);// risultato: Centro: (2, -1.5) – Raggio: 5.7

Page 13: Programmazione Orientata agli Oggetti in Linguaggio Javadb.unibas.it/users/mecca/corsi/2004-2005/progOggettiI/materiale/Me… · La Classe Object mNei linguaggi moderni (Java, C#)

10/05/2005

13

25G. Mecca - Programmazione Orientata agli Oggetti

La Classe Object

m Lo stesso discorso vale per equals()ðtutti gli oggetti hanno un metodo public

boolean equals(Object o) ereditato da Objectðche dovrebbe consentire di confrontarli con

altri oggettiðma il metodo è sostanzialmente inutile,

perchè non fa altro che confrontare i due riferimentiðdi conseguenza, se necessario, va ridefinito

Sintassi e Semantica: Introduzione all'Ereditarietà >> La Classe Object

in java.lang.Object: public boolean equals(Object obj) {

return (this == obj);}

26G. Mecca - Programmazione Orientata agli Oggetti

La Classe Object

mRegola n. 2: sostituibilità del tipoðun oggetto di tipo Calcolatrice è anche un

oggetto di tipo Objectðpuò essere usato dovunque serva un oggetto

di tipo Objectðes: è possibile scrivere

Object o = new Calcolatrice();

Sintassi e Semantica: Introduzione all'Ereditarietà >> La Classe Object

Page 14: Programmazione Orientata agli Oggetti in Linguaggio Javadb.unibas.it/users/mecca/corsi/2004-2005/progOggettiI/materiale/Me… · La Classe Object mNei linguaggi moderni (Java, C#)

10/05/2005

14

27G. Mecca - Programmazione Orientata agli Oggetti

Riassumendo

m IntroduzionemPerchè Esiste l’EreditarietàmRegole Meccanichem La Classe Object

Sintassi e Semantica: Introduzione all'Ereditarietà >> Sommario

28G. Mecca - Programmazione Orientata agli Oggetti

Termini della Licenza

Termini della Licenza

m This work is licensed under the Creative Commons Attribution-ShareAlike License. To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/1.0/ or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.

m Questo lavoro viene concesso in uso secondo i termini dellalicenza “Attribution-ShareAlike” di Creative Commons. Per ottenereuna copia della licenza, è possibile visitarehttp://creativecommons.org/licenses/by-sa/1.0/ oppure inviare unalettera all’indirizzo Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.