ADT parametriciObject Oriented Programming
Corso di Linguaggi di ProgrammazioneLezione 9
Alberto [email protected]
Dipartimento di Tecnologie dell’InformazioneUniversità degli Studi di Milano
01 Aprile 2008
A. Ceselli, DTI – Univ. di Milano Corso di Linguaggi di Programmazione
ADT parametriciObject Oriented Programming
ADT param. in CADT param. in AdaADT param. in C++ADT param. in JavaADT param. in C sharp
ADT parametrici
A. Ceselli, DTI – Univ. di Milano Corso di Linguaggi di Programmazione
ADT parametriciObject Oriented Programming
ADT param. in CADT param. in AdaADT param. in C++ADT param. in JavaADT param. in C sharp
Polimorfismo parametrico
Obiettivo: riuso del software.
Definition (Sottoprogramma polimorfo – o generico)
è un sottoprogramma che accetta parametri di tipo diverso perattivazioni diverse.
Definition (Polimorfismo parametrico)è fornito da un sottoprogramma che prende un parametrogenerico, che è utilizzato per definire il tipo dei parametri delsottoprogramma.
Idea: avere sottoprogrammi generici, senza rinunciare aicontrolli di tipo a compile time.
A. Ceselli, DTI – Univ. di Milano Corso di Linguaggi di Programmazione
ADT parametriciObject Oriented Programming
ADT param. in CADT param. in AdaADT param. in C++ADT param. in JavaADT param. in C sharp
ADT param. in C
stessi problemi visti in precedenzala printf non è generica
A. Ceselli, DTI – Univ. di Milano Corso di Linguaggi di Programmazione
ADT parametriciObject Oriented Programming
ADT param. in CADT param. in AdaADT param. in C++ADT param. in JavaADT param. in C sharp
ADT param. in Ada
Stack ristretto a contenere valori interiLo stack può contenere al massimo 100 elementiCODICE ESEMPIOinterfaccia ed implementazione possono essere in filesdiversi.Float_Stack e Int_Stack generano due versionidiverse del codice sorgente a compile time.
A. Ceselli, DTI – Univ. di Milano Corso di Linguaggi di Programmazione
ADT parametriciObject Oriented Programming
ADT param. in CADT param. in AdaADT param. in C++ADT param. in JavaADT param. in C sharp
ADT param. in C++
CODICE ESEMPIOinterfaccia ed implementazione nello stesso filetemplate per definire il parametro di tipoIl tipo è poi utilizzato all’interno della structFunziona in modo simile ad una macro, sostituendo ilcodice del template nel codice del client a compile time (eper questo deve essere tutto nell’header, e di conseguenzaviene trattato inline)
A. Ceselli, DTI – Univ. di Milano Corso di Linguaggi di Programmazione
ADT parametriciObject Oriented Programming
ADT param. in CADT param. in AdaADT param. in C++ADT param. in JavaADT param. in C sharp
ADT param. in Java
da Java 5.0CODICE ESEMPIOla virtual machine è la stessa: poca efficienzapermette una gestione fine dei tipi generici (es. wildcards’?’ per i tipi ...)
A. Ceselli, DTI – Univ. di Milano Corso di Linguaggi di Programmazione
ADT parametriciObject Oriented Programming
ADT param. in CADT param. in AdaADT param. in C++ADT param. in JavaADT param. in C sharp
ADT param. in C sharp
da .NET versione 2.0CODICE ESEMPIOgestito in modo efficiente: codice viene “duplicato” arun-time solo in caso di necessità
A. Ceselli, DTI – Univ. di Milano Corso di Linguaggi di Programmazione
ADT parametriciObject Oriented Programming
Il concetto di programmazione ad oggettiEreditarietà
Object Oriented Programming (1)
A. Ceselli, DTI – Univ. di Milano Corso di Linguaggi di Programmazione
ADT parametriciObject Oriented Programming
Il concetto di programmazione ad oggettiEreditarietà
Approccio procedurale ed approccio ad oggetti
Approccio procedurale: il programma è una sequenza diistruzioni, opportunamente organizzata in funzioni eprocedure.Approccio ad oggetti: il programma è composto da oggettiche si scambiano messaggi.
A. Ceselli, DTI – Univ. di Milano Corso di Linguaggi di Programmazione
ADT parametriciObject Oriented Programming
Il concetto di programmazione ad oggettiEreditarietà
OOP e riuso
obiettivo principale: ancora riuso. Gli ADT sono adatti adessere riutilizzati?
A. Ceselli, DTI – Univ. di Milano Corso di Linguaggi di Programmazione
ADT parametriciObject Oriented Programming
Il concetto di programmazione ad oggettiEreditarietà
OOP e riuso
ADT e riuso:- vantaggio: modularità- svantaggio: chi modifica deve capire il codice esistente- svantaggio: spesso se la modifica non è solo
all’implementazione, ma anche alla struttura dell’ADT,anche il codice client deve essere aggiornato
idea: i nuovi ADT sono specializzazioni dei vecchi, e neereditano le funzionalità (aggiungendone nuove)il programmatore si preoccupa solo delle nuovefunzionalità (trascurando come siano implementate quellegià esistenti).utile anche per realizzare una sola volta codice comune adiversi ADT.
A. Ceselli, DTI – Univ. di Milano Corso di Linguaggi di Programmazione
ADT parametriciObject Oriented Programming
Il concetto di programmazione ad oggettiEreditarietà
Esempio di approccio ad oggetti
Esempio: arciere, vento e giudice (alla lavagna).
A. Ceselli, DTI – Univ. di Milano Corso di Linguaggi di Programmazione
ADT parametriciObject Oriented Programming
Il concetto di programmazione ad oggettiEreditarietà
Nomenclatura:
a moduli ad oggettiADT classeistanze di un ADT oggetti (o istanze di una classe)sottoprogrammi metodivariabili proprietà
storicamente: SIMULA 67una classe che deriva da un’altra si dice sottoclasse(subclass)la classe dalla quale deriva la nuova classe si dicesuperclasse (superclass)
A. Ceselli, DTI – Univ. di Milano Corso di Linguaggi di Programmazione
ADT parametriciObject Oriented Programming
Il concetto di programmazione ad oggettiEreditarietà
Esempio di costruzione di un oggetto
Esempio: arciere, vento e giudice (alla lavagna).
Al posto di un semplice arciere potrei avere unarciere_abile (che regola il suo tiro in base al risultatoprecedente).Vento potrebbe accomunare alcune caratteristiche di tutti iventi: Bora, Maestrale ..., ma non fornire i dettagli su comela taiettoria viene modificata.
A. Ceselli, DTI – Univ. di Milano Corso di Linguaggi di Programmazione
ADT parametriciObject Oriented Programming
Il concetto di programmazione ad oggettiEreditarietà
Features richieste al linguaggio:
1 Supporto per ADT (lezione 8)2 Ereditarietà3 Binding dinamico di chiamate a metodi (e possibilità di
polimorfismo)
A. Ceselli, DTI – Univ. di Milano Corso di Linguaggi di Programmazione
ADT parametriciObject Oriented Programming
Il concetto di programmazione ad oggettiEreditarietà
Il concetto di sottotipo
un tipo A è un insieme di elementi, un sottotipo B del tipo Aè un sottoinsieme degli elementi di Aper ogni elemento b ∈ B vale b ∈ A: vale la relazione è-unrispetto ad A.più concretamente: in un programma B può apparireovunque appare A.
A. Ceselli, DTI – Univ. di Milano Corso di Linguaggi di Programmazione
ADT parametriciObject Oriented Programming
Il concetto di programmazione ad oggettiEreditarietà
Il concetto di sottotipo
Es. ADA:subtype Small_Int is Integer range -100..100;
Small_Int ha tutte le operazioni di Integer, ma puòassumere meno valori.N.B un sottotipo è compatibile con il tipo da cui deriva, main generale non equivalente!infatti Small_Int è compatibile con Integer, ma nonviceversa.
A. Ceselli, DTI – Univ. di Milano Corso di Linguaggi di Programmazione
ADT parametriciObject Oriented Programming
Il concetto di programmazione ad oggettiEreditarietà
Il concetto di sottoclasse
una classe derivata è una sottoclasse se è in relazioneè-un con la sua superclasseuna sottoclasse è un sottotipo se assicuro che:
una sottoclasse possa solo aggiungere proprietà e metodioppure ridefinire metodi della superclasse in modocompatibile (senza causare errori di tipo)
A. Ceselli, DTI – Univ. di Milano Corso di Linguaggi di Programmazione
ADT parametriciObject Oriented Programming
Il concetto di programmazione ad oggettiEreditarietà
Ereditarietà
Definition (Ereditarietà)è la proprietà di una sottoclasse di possedere tutte lecaratteristiche della superclasse
Arredamento_v1.cpp
A. Ceselli, DTI – Univ. di Milano Corso di Linguaggi di Programmazione
ADT parametriciObject Oriented Programming
Il concetto di programmazione ad oggettiEreditarietà
Overriding
Una sottoclasse può ridefinire un metodo delle suesuperclassiIl nuovo metodo sovrascrive (overrides) quello dellesuperclassiArredamento_v1.cpp
A. Ceselli, DTI – Univ. di Milano Corso di Linguaggi di Programmazione
ADT parametriciObject Oriented Programming
Il concetto di programmazione ad oggettiEreditarietà
Costruttori e distruttori
Spesso le istanze di una classe vengono allocatedinamicamente nello heap (Java, C#): es. keyword new.C++ permette di allocare memoria sia nello stack che nelloheap.Ogni classe ha un costruttore chiamato al momentodell’allocazioneSpesso le classi hanno un distruttore chiamato almomento della deallocazione (delete in C++)Arredamento_dyna.cpp
A. Ceselli, DTI – Univ. di Milano Corso di Linguaggi di Programmazione
ADT parametriciObject Oriented Programming
Il concetto di programmazione ad oggettiEreditarietà
Ereditarietà singola e multipla
Il linguaggio permette ad una sottoclasse di ereditare dapiù superclassi?Arredamento_mult1.cpp
1 Problema dell’ambiguità
Es. A deriva sia da B che da C; sia B che C hanno unmetodo display che può essere ereditato.C++ permette eredità multipla, e risolve ambiguitàutilizzando ::, ovvero A non eredita display, maB::display e C::display
A. Ceselli, DTI – Univ. di Milano Corso di Linguaggi di Programmazione
ADT parametriciObject Oriented Programming
Il concetto di programmazione ad oggettiEreditarietà
Ereditarietà singola e multipla
Il linguaggio permette ad una sottoclasse di ereditare dapiù superclassi?Arredamento_mult2.cpp
2 Problema degli antenati comuni (“diamond” o “shared”inheritance)
Es. Sia B che C derivano da D; A deriva sia da B che da C:A deve ereditare due copie di tutti i metodi di D? Oppuresolo una copia? Da quale genitore?C++ permette eredità multipla, e risolve ambiguitàutilizzando ::
A. Ceselli, DTI – Univ. di Milano Corso di Linguaggi di Programmazione
ADT parametriciObject Oriented Programming
Il concetto di programmazione ad oggettiEreditarietà
Implementazione di ereditarietà singola e multipla
A compile time viene costruito per ogni classe (esottoclasse) un class instance record (CIR), in cui sonomemorizzate proprietà e puntatori ai metodi.Ereditarietà multipla in sintesi: molta flessibilità, marginaleproblema di efficienza, sostanziale problema di struttura emanutenzione del codice.
A. Ceselli, DTI – Univ. di Milano Corso di Linguaggi di Programmazione
ADT parametriciObject Oriented Programming
Il concetto di programmazione ad oggettiEreditarietà
Ereditarietà e scope
Modificatori di scope:public: visibile ai metodi della classe, metodi dellesottoclassi e codice clientprivate: visibile solo ai metodi della classeprotected: visibile ai metodi della classe e dellesottoclassi (a volte a tutte le sottoclassi nel package, es.Java), ma non a codice clientalcuni linguaggi hanno modificatori appositi per il package(es. internal in C#)C++ utilizza anche friendIn C++ i modificatori di scope sono utilizzati anche durantel’estensione di una classe class Sedia : publicMobile ...
A. Ceselli, DTI – Univ. di Milano Corso di Linguaggi di Programmazione
ADT parametriciObject Oriented Programming
Il concetto di programmazione ad oggettiEreditarietà
Ereditarietà e scope
N.B. Ricordando che una sottoclasse è un sottotipo seassicuro che:
una sottoclasse possa solo aggiungere proprietà e metodioppure ridefinire metodi della superclasse in modocompatibile (senza causare errori di tipo)
utilizzare private nella derivazione di una classe C++potrebbe impedire alle sottoclassi di essere sottotipi dellasuperclasse.
A. Ceselli, DTI – Univ. di Milano Corso di Linguaggi di Programmazione
ADT parametriciObject Oriented Programming
Il concetto di programmazione ad oggettiEreditarietà
Un oggetto conosce se stesso
Come per gli ADT, i metodi di una classe hanno accessoagli altri metodi ed alle proprietà della classe... e anche all’oggetto stessoEs. this in C++Spesso ha accesso anche alla superclasse (Es. super inJava o base in C#) o alle superclassi (superclasse_A::in C++)
A. Ceselli, DTI – Univ. di Milano Corso di Linguaggi di Programmazione