Professional Documents
Culture Documents
Strutture dati
Programmazione procedurale
Automobile
Stato:
Motore_acceso: (booleano)
Marcia_inserita: (1,2,3,4,5,R)
Velocità: (valore numerico)
Comportamento:
Accendi_motore
Spegni_motore
Accelera
Frena
Sterza…
Modellare la realtà
Stato
L’insieme dei parametri caratteristici che
contraddistinguono un oggetto in un dato istante
Modellato come insieme di attributi
Comportamento
Descrive come si modifica lo stato a fronte degli
stimoli provenienti dal mondo esterno
Modellato come insieme di metodi
Classi
La classe costituisce il “progetto” di un oggetto
Specifica gli attributi
Descrive i metodi
Indica lo stato iniziale
Ogni classe ha un nome
Deve essere univoco
Oggetti
Data una classe, è possibile costruire uno o più oggetti
Gli oggetti vengono detti “istanze” della classe
In C# per creare un oggetto si utilizza la notazione
new NomeClasse ( );
Ogni oggetto “vive” all’interno della memoria del calcolatore
Qui viene memorizzato il suo stato
Oggetti differenti occupano posizioni differenti
Oggetti
{…
Cerchio c;
c= new Cerchio();
…}
Ciclo di vita
delle variabili locali
Le variabili locali “esistono” finché il metodo (blocco di codice) che le
definisce è in esecuzione
Quando si incontra la loro definizione, il sistema riserva un’area di memoria per
ospitarne il contenuto
Quando il metodo (blocco) termina, l’area viene rilasciata ed il contenuto della
variabile perso
La memoria viene prelevata da una zona apposita detta “stack” (quella in cui si
trovano gli oggetti, invece, si chiama “heap”)
Riferimenti multipli
Uno stesso oggetto può essere denotato da più variabili
Succede quando si assegna ad un variabile il valore contenuto in un’altra variabile
Le variabili condividono il riferimento allo stesso oggetto
r:1.0
c1
c2
Variabili elementari
Non tutte le variabili contengono un riferimento
Le informazioni più semplici possono essere memorizzate direttamente nella
variabile
È il caso delle variabili il cui tipo è elementare (detto anche primitivo)
Copia di variabili elementari
Se si assegna ad una variabile elementare il valore di un’altra variabile viene
eseguita una copia del valore
I due valori diventano disgiunti e potranno evolvere indipendentemente
Riferimenti nulli
Nel caso di variabili di tipo classe, a volte occorre indicare che non
contengono nessun valore
In java ed in C# si usa la parola chiave null
Se una variabile vale null, non è possibile accedere ai metodi o agli attributi
Riferimenti nulli
Memoria
Cerchio c;
c= new Cerchio();
...
c=null
r:1.0
c
Riferimenti nulli
Memoria
Cerchio c;
c= new Cerchio();
...
c=null
r:1.0
c
Accedere agli oggetti
Noto il riferimento ad un oggetto, è possibile invocarne i metodi
Si usa la notazione
variabile.metodo(...);
Nelle parentesi si indicano gli eventuali parametri
Lettori (accessor)
Permettono di conoscere lo stato (o una sua parte specifca) di un oggetto
Di solito, non hanno parametri, e ritornano il valore letto
Per convenzione, in Java, hanno un nome simile a
<tipoRitornato> getXyz();
Attributi
Come le variabili, anche gli attributi possono avere tipi
Elementari
Complessi (riferimenti ad oggetti)
Nel momento in cui non esistano più riferimenti, l’oggetto può essere
eliminato
Rilasciando la memoria che occupa
Public
Indica che l’elemento può essere utilizzato da metodi di qualsiasi classe
Potected
Indica che si può accedere all’elemento solo da classi e metodi appartenenti allo
stesso namespace
Visibilità delle classi
Anche le classi possono essere precedute da un modificatore di visibilità
In questo caso, “private” non ha senso
Di solito:
Attributi privati
Metodi pubblici
Costruttori pubblici (*)
La classe java “System” contiene, sotto forma di attributi statici, oggetti che
modellano le interazioni con la console di sistema
System.out //output su schermo
System.in //input da tastiera
La classe String
Classe che modella sequenze immutabili di caratteri
Sintassi semplificata
String s1= “Hello” ;
String s2 = s1+ “ World”
La classe derivata:
Dispone di tutte le funzionalità (attributi e metodi) di quella base
Può aggiungere funzionalità proprie
Può ridefinirne il funzionamento di metodi esistenti (polimorfismo)
Bicicletta
Esempio coppia
rapportoPosteriore
…
pedala(coppia)
cambiaRapporto(n)
frena(intensità)
…
MountainBike Tandem
rapportoAnteriore coppia2
cambiaRapportoAnt(n) pedala2(coppia)
Terminologia
Classe base,
Bicicletta superclasse
MountainBike Tandem
Classi derivate,
sottoclassi
Astrazione
Il processo di analisi e progettazione del software di solito
procede per raffinamenti successivi
Spesso capita che le similitudini tra classi non siano colte inizialmente
In una fase successiva, si coglie l’esigenza/opportunità di introdurre un
concetto più generico da cui derivare classi specifiche
Processo di astrazione
Si introduce la superclasse che “astrae” il concetto comune condiviso
dalle diverse sottoclassi
Le sottoclassi vengono “spogliate” delle funzionalità comuni che migrano
nella superclasse
Veicolo
double getVelocità()
double getAccelerazione()
…
Bicicletta Automobile
void pedala() void avvia()
void spegni()
Tipi ed ereditarietà
Ogni classe definisce un tipo:
Un oggetto, istanza di una sotto-classe, è formalmente compatibile con il tipo della
classe base
Il contrario non è vero!
Esempio
Un’automobile è un veicolo
Un veicolo non è (necessariamente) un’automobile
Permettere il riuso
di funzionalità
Semplificare la costruzione
di nuove classi
Facilitare la manutenzione
Ri-definizione di metodi
Costruzione
Per realizzare un’istanza di una classe derivata, occorre – innanzi tutto –
costruire l’oggetto base
Di solito, provvede automaticamente il compilatore, invocando – come prima
operazione di ogni costruttore della classe derivata – il costruttore anonimo della
superclasse
Si può effettuare in modo esplicito, attraverso il costrutto super(…)
Eventuali ulteriori inizializzazioni possono essere effettuate solo successivamente
class Impiegato {
String nome;
Esempio
double stipendio;
Impiegato(String n) {
nome = n;
stipendio= 1500; class Funzionario
} : Impiegato {
}
Funzionario(String n) {
stipendio = 2000;
}
}
Accedere alla superclasse
L’oggetto derivato contiene tutti i componenti (attributi e metodi)
dell’oggetto da cui deriva
Ma i suoi metodi non possono operare direttamente su quelli definiti privati
Cerchio Rettangolo
d1=f1.area();
area() area() d2=f2.area();
perimetro() perimetro()
Controllare l’ereditarietà
In alcuni casi, si vuole impedire esplicitamente l’utilizzo della tecnica
del polimorfismo
Ad esempio, per motivi di sicurezza o per garantire il mantenimento di una
data proprietà del sistema
In java si utilizza la parola chiave “final”, in c# si usa “sealed”.