Sei sulla pagina 1di 28

Programmazione

ad oggetti
A. Lorenzi – M. Govoni
INFORMATICA, STRUMENTI E METODI
Per LSA
Atlas

Copyright © Istituto Italiano Edizioni Atlas


L’astrazione

Nella descrizione della realtà si opera una


semplificazione, limitandosi alla
considerazione delle sole parti considerate
rilevanti per la trattazione.

Questo processo di semplificazione della


realtà complessa è detto astrazione.
L’astrazione

Un’applicazione software solitamente


rappresenta un’astrazione della realtà.

Completata questa fase di astrazione o


analisi del problema, si passa alla
sua implementazione attraverso la
programmazione nel linguaggio
prescelto.
Programmazione procedurale

Nella programmazione procedurale


il programma, composto di dati e
istruzioni, elenca le istruzioni che il
computer deve eseguire.
I diversi percorsi possibili sono gestiti
attraverso le strutture di controllo.
Programmazione ad oggetti

La programmazione orientata agli oggetti, in breve OOP


(Object-Oriented Programming) prende il nome dall’elemento su
cui si basa: l’oggetto.

Interazioni tra gli oggetti: gli oggetti possono


cambiare il loro stato e possono richiedere
l’esecuzione di operazioni associate ad altri oggetti.

Principali vantaggi:
• facilità di lettura e di comprensione del codice;
• manutenzione del programma;
• robustezza del programma;
• riusabilità di parti di codice.
Oggetti, attributi, metodi

Gli oggetti rappresentano le entità del problema o della realtà


che si vuole automatizzare con l’informatica.
Un oggetto è in grado di memorizzare le informazioni
che riguardano il suo stato; è anche possibile associare
ad un oggetto un insieme di operazioni che esso può compiere.

Gli attributi rappresentano gli elementi che caratterizzano


l’oggetto, utili per descrivere le sue caratteristiche e definirne
il suo stato.

I metodi rappresentano i comportamenti e le funzionalità


che l’oggetto mette a disposizione.
La classe

La classe è la descrizione astratta degli oggetti attraverso


gli attributi e i metodi. Per utilizzare un oggetto occorre crearlo
come esemplare della classe, cioé come istanza di una classe.

• Il diagramma della classe


evidenzia il nome, gli
attributi e i metodi.
• Attributi e metodi, si
chiamano membri della
classe.
Incapsulamento e Information hiding

Il termine incapsulamento indica la qualità degli oggetti


di poter incorporare al loro interno sia gli attributi sia i metodi,
cioè le caratteristiche e i comportamenti dell’oggetto.

Il termine information hiding indica il mascheramento


delle modalità di implementazione di un’oggetto, rendendone
disponibili all’esterno solo le funzionalità.
Creazione di una classe

Per definire la classe si utilizza la dichiarazione class.

class NomeClasse {
// attributi
tipo1 attributo1;
tipo2 attributo2;
...
// metodi
tipo1 Funzione1() {...};
tipo2 Funzione2() {...};
...
};
Istanze

La creazione delle sue istanze, cioè degli oggetti:

NomeClasse NomeOggetto;

• L’attributo di un oggetto:
NomeOggetto.NomeAttributo

• Il metodo di un oggetto:
NomeOggetto.NomeFunzione()
Risoluzione della visibilità della classe

tipo NomeClasse::Funzione {
...
return;
}

Il simbolo doppio due punti, ::, si chiama


operatore di risoluzione della visibilità della classe.
Risoluzione della visibilità della classe

class Rettangolo {
// attributi
double base, altezza;
public:
// metodi
void Assegna(double, double);
double Area();
};
void Rettangolo::Assegna(double b, double h)
{
base = b;
altezza = h;
}
double Rettangolo::Area()
{
return base*altezza;
}
Costruttore

Con la dichiarazione di un’istanza, viene attivato in modo


implicito un metodo predefinito, detto costruttore
(constructor) della classe, che consente di creare un oggetto.

class Rettangolo {
// attributi
double base, altezza;
public:
// metodi
void Assegna(double, double);
double Area();
// costruttore
Rettangolo() {
base = 0.0;
altezza = 0.0;
}
};
Distruttore

Il metodo distruttore (destructor) è richiamato


automaticamente quando l’oggetto perde la visibilità e
la memoria occupata dai suoi attributi viene liberata.

Rettangolo::~Rettangolo() {
cout << "oggetto eliminato" << endl;
}
Costruttore di copia

Il costruttore di copia (copy constructor) è un costruttore


richiamato durante la creazione di un’istanza inizializzata
da un’altra istanza della stessa classe.

Rettangolo::Rettangolo(Rettangolo& r) {
base = r.base * 2;
altezza = r.altezza + 5;
}

Rettangolo r1(10.0, 2.0);


Rettangolo r2(r1);
Visibilità dei membri

• Clausola public: i membri specificati dopo


di essa sono disponibili anche al di fuori
della classe di appartenenza.

• Clausola private: tutti i membri che


seguono, attributi o metodi, non possono
essere visti al di fuori della classe.
Messaggi e interfaccia
• L’interazione con gli oggetti prende il nome di
scambio di messaggi.
• L’invio di un messaggio è indicato con:

oggetto.membro
(membro può essere un metodo o un attributo)

L’insieme dei messaggi, che consentono l’interazione


con l’oggetto, rappresenta la sua interfaccia.
Funzioni friend

Funzione friend è una funzione in grado di accedere


ai membri privati di una classe, pur non
appartenendovi.
Questo diritto è concesso dalla classe stessa
specificando il prototipo della funzione, preceduto
dalla parola chiave friend.
Ereditarietà

L’ereditarietà rappresenta la
possibilità di creare nuove classi a
partire da una classe già esistente
(classe base o superclasse).
La nuova classe eredita tutti gli
attributi e i metodi della classe base
e può essere arricchita con nuovi
attributi e nuovi metodi.
La classe così ottenuta si chiama
classe derivata.
Gerarchia delle classi
La classe derivata da un’altra, usando l’ereditarietà, prende il
nome di sottoclasse.
La classe generatrice di una sottoclasse si chiama superclasse
o sopraclasse.
Ereditarietà singola e multipla

• L’ereditarietà
singola: una
sottoclasse deriva da
un’unica sopraclasse.

• L’ereditarietà
multipla: una classe
deriva da due o più
sopraclassi.
Polimorfismo

Polimorfismo degli oggetti: capacità di far assumere


agli oggetti comportamenti diversi, determinati da
una diversa implementazione dei suoi membri o da
una diversa firma,
cioè i metodi della classe ereditata differiscono dai
metodi della classe base nel numero oppure nel tipo
dei parametri, o in entrambi.
Overloading dei metodi

Il metodo può avere lo stesso nome


del metodo definito nella classe
base, ma opera in maniera
differente.

Metodi con lo stesso nome hanno


argomenti diversi (e solitamente
comportamenti diversi).

Si dice che i metodi differiscono per


la firma, cioè nel numero oppure
nel tipo di parametri, o in entrambi.
Membri protetti
La clausola protected indica la visibilità di un membro
solamente alla classe stessa e alle classi derivate.

L’attributo non è visibile alle funzioni esterne alla classe,


ma è disponibile per i metodi della classe derivata.
class Anagrafica {
public:
// attributi
int codice;
string cognome;
string nome;
// metodi
void Registra();
void Mostra();
protected:
// attributo
bool registrato;
};
Overriding dei metodi

Sovrascrivere, nella classe derivata,


un metodo ereditato, cambiando
le istruzioni che descrivono
il comportamento, ma mantenendo
uguale la firma, quindi il numero
e il tipo dei parametri.
Al momento dell’esecuzione, il
programma decide quale metodo
utilizzare a seconda dell’oggetto, base
o derivato, al quale viene applicato il
metodo.
Overloading degli operatori

(sovraccarico dell’operatore)
definire nuove funzionalità ai vari operatori del
linguaggio (++, – –, =), in modo che il
compilatore sia in grado di comprendere il loro
impiego nei nuovi tipi di dati creati dal
programmatore.
Funzioni virtuali
• Clausola virtual nella dichiarazione dei metodi
della classe base, che saranno sottoposti a
polimorfismo.
class Rettangolo {
protected:
// attributi
double base, altezza;
public:
// metodi
void Assegna(double, double);
virtual double Area();
virtual double Perimetro();
void Stampa();
Rettangolo() : base(0.0),altezza(0.0) { }
~Rettangolo();
};
Vantaggi della programmazione ad oggetti

• La classe originale (classe base) è lasciata intatta:


le variazioni al codice sono implementate nella
classe derivata.
• Acquisto di classi base da un produttore di software
senza disporre del codice sorgente.
• La classe base è priva di errori (bug-free), in
quanto già testata.
• Riutilizzo del codice riducendo i tempi e i costi di
realizzazione di nuovo software.

Potrebbero piacerti anche