Programmazione orientata agli oggetti: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
m Orfanizzo Java (linguaggio) → Java (linguaggio di programmazione) using AWB
m tag obsoleti
Riga 46:
{{vedi anche|Oggetto (informatica)}}
Un ''oggetto'' è una istanza di una classe. Esso è dotato di tutti gli attributi e i metodi definiti dalla classe, ed agisce come un fornitore di "messaggi" (i metodi) che il codice eseguibile del programma (procedure o altri oggetti) può attivare su richiesta.<br />
''Inviare un messaggio ad'' un oggetto si dice, in gergo, ''invocare un metodo su'' quell'oggetto. Il metodo riceve come parametro (spesso implicito) l'oggetto su cui è stato invocato, che può essere referenziato tramite una parola-chiave o una sintassi apposita, anche se è passato come parametro implicito; per esempio, in [[C++]], in [[Java (linguaggio di programmazione)|Java]], e in [[C sharp|C#]] si usa la parola-chiave <ttcode>this</ttcode> (<ttcode>$this</ttcode> in PHP), mentre in [[Smalltalk]], in [[Objective C|Objective-C]], [[Python]] e in [[Ruby]] si usa la parola-chiave <ttcode>self</ttcode>.
 
Dal punto di vista del calcolatore, ogni oggetto è identificato da una certa [[memoria RAM|zona di memoria]], nella quale sono memorizzati gli ''[[Attributo (programmazione)|attributi]]'', e il valore di questi ultimi determina lo stato interno dell'oggetto. ''Istanziare'' un oggetto vuol dire [[allocazione della memoria|allocare]] memoria ed eventualmente inizializzarla secondo le specifiche definite dalla classe. Molti linguaggi forniscono un supporto per l'inizializzazione automatica di un oggetto, con uno o più metodi speciali, detti ''[[Costruttore (informatica)|costruttori]]''. Analogamente, la fine della vita di un oggetto può essere gestita con un metodo detto ''[[distruttore (informatica)|distruttore]]''.
Riga 68:
 
; Esempio
Se nel programma esiste già una classe <ttcode>MezzoDiTrasporto</ttcode> che ha come proprietà i dati di posizione, velocità, destinazione e carico utile, e occorre una nuova classe <ttcode>Aereo</ttcode>, è possibile crearla direttamente dall'oggetto <ttcode>MezzoDiTrasporto</ttcode> dichiarando una classe di tipo <ttcode>Aereo</ttcode> che eredita da <ttcode>MezzoDiTrasporto</ttcode> e aggiungendovi anche l'attributo che identifica la [[quota di crociera]], con il vantaggio che la nuova classe acquisirà tutti i membri definiti in <ttcode>MezzoDiTrasporto</ttcode> per il fatto stesso di esserne sottoclasse.
 
=== Sottotipizzazione ===
Riga 74:
Sebbene concettualmente esistano delle differenze ben marcate, il meccanismo di eredità fra classi (''subclassing''), attraverso il meccanismo del polimorfismo per inclusione, permette nei linguaggi ad oggetti di modellare l'eredità fra tipi (''subtyping'').
 
Secondo il [[principio di sostituzione di Liskov]], un tipo <ttcode>S</ttcode> è un ''sottotipo'' di <ttcode>T</ttcode> quando è possibile sostituire tutte le istanze di <ttcode>T</ttcode> con delle istanze di <ttcode>S</ttcode> mantenendo intatto il funzionamento del programma.
 
Con gli opportuni accorgimenti è possibile creare una relazione di classe-sottoclasse che rispetti anche i vincoli della relazione tipo-sottotipo. Da un punto di vista sintattico, ciò richiede che tutti i metodi della superclasse siano presenti nella sottoclasse, e che le rispettive ''[[Firma (programmazione)|signature]]'' siano compatibili. Di conseguenza, una sottoclasse che voglia definire un sottotipo può ridefinire i metodi della superclasse, ma non può eliminarli. La ''signature'' dei metodi può essere solo parzialmente modificata, rispettando dei vincoli sulla variazione dei parametri rispetto alla catena di eredità.