Per procedere, è necessario comprendere alcuni
termini specifici della OOP. Uno dei primi è Class (Classe). La classe
estende il concetto di tipo, nel senso che include e specifica sia la struttura
dati che i metodi comuni a tutti gli oggetti di una certa categoria. Questo
conduce a definire le classi come degli stampi ,delle matrici (in inglese blueprint), dai quali ottenere gli oggetti. Quando viene
creato un oggetto da una classe si dice che è stata creata un’istanza
di una classe. Per esempio, in Java un
istruzione quale: Audioclip meow =
new AudioClip()
crea una nuova istanza denominata meow della classe ,precedentemente definita o
preesistente, AudioClip; in questo linguaggio l’operatore per creare istanze da
classi è new, questo operatore alloca la memoria necessaria, in seguito
la funzione di garbage collector provvederà a “ripulire” lo
spazio di memoria(osserviamo che queste fasi sono nascoste al
programmatore). In Pascal, le istanze di un nuovo oggetto si dichiarano
nello stesso modo delle normali variabili, facendo riferimento a definizioni
del tipo oggetto (la classe) o stabilite dal programmatore o già preesistenti;
per esempio:
type Location = Object
{si definisce la classe Location}
x,y :
Integer ;
end
var Point : Location; {si crea un istanza denominata Point, della
classe Location}
end
·Uso
·Contenimento ·Ereditarietà.
La relazione d’uso è la più ovvia e anche la più
generale, una classe ne usa un’altra se manipola oggetti di quest’ultima, è
opportuno cercare di ridurre al minimo il numero delle classi che fanno uso di
altre per massimizzare l’affidabilità del sistema.Contenimento significa che
gli oggetti della classe A contengono oggetti della classe B; è un caso
particolare di uso. La relazione di ereditarietà denota specializzazione, nei
linguaggi che supportano gli oggetti,
l’ elaborazione di classi
“personalizzate” è facilitata da un fondamentale principio: l’ereditarietà. Le classi possono essere (ed in taluni
linguaggi, come Java, lo sono sempre!) costruite su altre classi. Una classe
costruita su un’altra estende quest’ultima, nel senso che la nuova classe
inizialmente, possiede tutte le proprietà e metodi della classe di cui è
“figlia”; il programmatore può scegliere se modificare o semplicemente
conservare proprietà e metodi della classe parent e può inoltre fornire nuovi
metodi valevoli solo per la classe figlia. Questo principio è denotato
ereditarietà. La parola chiave in Java per estendere le classi è extends, Visual Basic attualmente non
prevede l’ereditarietà.
Queste tre relazioni tra le classi formano la base della OOP. I diagrammi delle
classi mostrano le classi (solitamente indicate da riquadri) e le loro
relazioni (indicate da linee con varie decorazioni che si differenziano
estremamente da una metodologia all’altra). La figura 1 illustra un esempio che
adotta la notazione UML (Universal Modeling Language), all’interno del
linguaggio Java. Nell’esempio viene trattato un sistema di elaborazione di
ordini commerciale, figurano 4 classi: order (ordini), item (articoli),account
(conto), rushorder (ordini urgenti). La classe ordini usa la classe conto in
quanto gli oggetti ordini devono accedere agli oggetti conto per controllare lo
stato del credito, gli oggetti ordini contengono oggetti articoli, gli oggetti
ordiniurgenti sono figli delle classe ordini.
Nella OOP vengono inviati messaggi (con eventuali
parametri) agli oggetti, chiedendo loro di eseguire azioni(metodi). E’
importante capire che cosa accade quando una chiamata di metodo è applicata a
oggetti di vario tipo in una gerarchia di ereditarietà. Quando viene inviato un
messaggio che chiede ad una sottoclasse di applicare un metodo adottando
determinati parametri, avviene quanto
segue:
Questa caratteristica del linguaggio è importante,
poiché capita spesso che una variabile venga usata come puntatore
indifferentemente a oggetti che stanno su livelli diversi della stessa scala
gerarchica, infatti se la classe B estende la classe A allora B è compatibile
con A, cioè tutte le espressioni valide per A lo sono anche per B, quindi una
variabile puntatore di tipo A può puntare anche ad oggetti di tipo B. La
capacità di un oggetto di decidere quale metodo applicare a se stesso, in base
alla propria posizione nella gerarchia dell’ereditarietà si chiama polimorfismo.
L’idea del polimorfismo è che il messaggio può anche essere lo stesso, gli
oggetti possono rispondere in modo diverso. Le singole classi della gerarchia,
utilizzando il polimorfismo sono responsabili dell’esecuzione dei dettagli, per
determinare quali metodi chiamare.
notazione UML
(Universal Modelling
Language) indicate
da riquadri, le loro relazioni da linee con vari attributi. Nell’esempio: la freccia indica
la relazione di ereditarietà,la linea d’uso, il
rombo di contenimento. Esistono strumenti che permettono di
ottenere la generazione di
codice a partire
dal diagramma UML.
Fig. 1
Un diagramma che adotta la
Le classi sono solitamente