Corso di Linguaggi di Programmazione - Lezione...

28
ADT parametrici Object Oriented Programming Corso di Linguaggi di Programmazione Lezione 9 Alberto Ceselli [email protected] Dipartimento di Tecnologie dell’Informazione Università degli Studi di Milano 01 Aprile 2008 A. Ceselli, DTI – Univ. di Milano Corso di Linguaggi di Programmazione

Transcript of Corso di Linguaggi di Programmazione - Lezione...

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