Ho notato spesso confusione quando si parla di Classi, Oggetti ed Istanze. Chi non è particolarmente istruito sulla programmazione ad oggetti spesso confonde il vero significato di questi termini. Sapevo, tuttavia, che esistono due scuole di pensiero riguardo alla definizione di Classe e Oggetto. A me piace la “scuola” che indica la Classe come definizione di un possibile Oggetto e, quindi, l’Oggetto come Istanza della Classe.
Sembra banale, tuttavia mi è capitato – discorrendo con altri – di trovarmi in “conflitto” (per così dire) e poi cadere in equivoci, quando si usano questi termini, partendo casomai dal presupposto che “l’altro” li intenda esattamente come noi.
Io la vedo in questo modo; una Classe è una definizione! Viene appunto definita una classe di possibili oggetti. La Classe è l’insieme di metodi e proprietà (se volete possiamo aggiungere anche gli eventi – che altro non solo che speciali metodi…) che possiederà l’oggetto.
Ad esempio quando scriviamo in Actionscript, o qualsiasi altro linguaggio ad oggetti:
1 2 3 4 | class MiaClasse { function MiaClass() {} function MioMetodo() {} } |
Abbiamo definito una Classe e non un Oggetto. Al limite abbiamo “definito” un “possibile” oggetto. Potremmo addirittura sostenere, e non a torto, che l’Oggetto esiste a runtime mentre la Classe no (in verità esistono Classi dinamiche che possono essere definite – e poi usate per creare oggetti – anche a runtime). Escludo le classi statiche, ovviamente che – alla fine – altro non sono che sotto-istanze (o istanze nascoste) e quindi oggetti veri e propri.
Quando invece abbiamo:
1 | var mioOggetto:MiaClasse = new MiaClasse(); |
Ecco che mioOggetto è una istanza di MiaClasse()! Cioè mioOggetto è un Oggetto – appunto – di tipo MiaClasse().
Ne deriva, proprio nella filosofia ad oggetti, che di Oggetti di tipo MiaClasse() ne posso avere quanti ne voglio, cosa che non può essere – per la definizione stessa – di MiaClasse(). Ad esempio, se vale ed ha senso la relazione:
1 2 3 4 5 | var mioOggetto_1:MiaClasse = new MiaClasse(); var mioOggetto_2:MiaClasse = new MiaClasse(); var mioOggetto_3:MiaClasse = new MiaClasse(); ... var mioOggetto_n:MiaClasse = new MiaClasse(); |
Non ha significato:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | class MiaClasse { function MiaClass() {} function MioMetodo_2() {} } class MiaClasse { function MiaClass() {} function MioMetodo_2() {} } class MiaClasse { function MiaClass() {} function MioMetodo_3() {} } |
Istanza e Oggetto, quindi, coincidono e sono usate alternativamente per lo stesso significato in diversi contesti.
Probabilmente non frega molto a nessuno… questione di esigenze di completezza…










7
[...] Per chi è proprio all’asciutto di programmazione ad oggetti, consiglio quantomeno la lettura di Classi, Oggetti e Istanze! [...]
[...] le variabili o costanti statiche sono associate alla classe e non all’istanza della classe! Vedi Classi, Oggetti e Istanze. Questa è una differenza importantissima, infatti nel nostro caso se scriviamo – a titolo di [...]
Lunedì ho l’esame di informatica su java, grazie mi sei stato utilissimo, il libro che ho era poco chiaro sull’argomento.
@Nik: Sono contento! In bocca al lupo dunque!!