Classi ed Oggetti
Una classe è una struttura composta da campi, metodi e proprietà,
detti anche componenti o membri. Una istanza di una classe è detta oggetto.
Un campo è assimilabile ai campi di un tipo record e rappresenta gli elementi
di dati presenti ciascuna istanza di classe. Un campo è come una varaibile che appartiene
all'oggetto e può essere di qualsiasi tipo. Questi devono trovarsi prima di qualsiasi
dichiarazione di proprietà o di metodo. Essi sono collegati in modo statico ed i relativi
collegamenti sono determinati in fase di compilazione.
Un metodo è una procedura o funzione che è associata ad una classe e può
operare su oggetti (istanze di classe) o sul tipo class stesso. Quest'ultimi vengono
chiamati metodi di classe. All'interno di una dichiarazione di classe, essi
appaiono come intestazioni di funzioni o procedure. Questo dovrà poi essere implementato
in una qualsiasi parte del modulo in cui è stata dichiarata la classe di appartenenza con
una definizione di dichiarazione all'interno della sezione implementation del
modulo. Nella definizione della dichiarazione del metodo, viene riportato il nome del
metodo così come è stato dichiarato nella dichiarazione di classe, preceduto dal nome
della classe stessa separati da un punto.
Es. Function MyClass.Getwidth : Integer;
Una proprietà è assimilabile ad un campo tranne per il fatto che differisce
nell'implementazione. La proprietà infatti è soprattutto una interfaccia verso i dati
contenuti nei campi dell'oggetto, mascherando le modalità di acesso ad essi. Infatti
queste hanno degli specificatori di accesso che definiscono la maniera in cui i
dati vengono scritti o letti nella proprietà.
Tutti gli oggetti vengono allocati dinamicamente nella memoria, utilizzando strutture
caratteristiche dipendenti dalla definizione del tipo class di appartenenza. Ogni oggetto
ha la sua copia univoca dei campi definiti nella classe, tutte le istanze di una classe
condividono gli stessi metodi.
Per la creazione e distruzione degli oggetti, esistono dei metodi speciali definiti Costruttori e Distruttori.
In definitiva, una variabile di tipo class è effettivamente un puntatore ad un
oggetto. A differenza dei normali puntatori, questi non necessitano della
dereferenziazione per accedere ai metodi, proprietà e campi del tipo class a cui
appartiene l'oggetto. Non è necessario scrivere MioOggetto^.MioMetodo, ma è sufficiente
scrivere MioOggetto.MioMetodo.
Prima di essere istanziato, un tipo class deve essere dichiarato. La dichiarazione di
tipi class può avvenire solamente nella sezione Type di livello più alto del programma o
della unit. Pertanto non è possibile dichiarare tipi class nella sezione di dichiarazione
di funzioni o procedure. La sintassi per la dichiarazione di un tipo class è la seguente:
Type NomeClasse = Class(ClasseAntenato)
ElencoMembri
End;
NomeClasse è ovviamente un qualsiasi identificatore riconosciuto valido dal
compilatore; ClasseAntenato indica la classe da cui eredità la nuova classe e
può essere facoltativo, con il risultato che in tal caso la classe erediterà
direttamente dalla classe predefinita TObject; ElencoMembri contiene
l'elenco di tutti i campi, proprietà e metodi che andranno costituire la nuova classe.
Quest'ultimo, può essere vuoto ed in tal caso è possibile omettere la parola chiave end.
La struttura di ElencoMembri è simile a quella vista nella dichiarazione di
tipi record con alcune differenze riguardanti il campo di visibilità dei membri, la
dichiarazione di proprietà (non presenti nei tipi record) e nella dichiarazione dei
metodi.
Una dichiarazione di classe, organizza i suoi membri in tre, quattro o cinque sezioni
definite come campi di visibilità. Queste sezioni indicano infatti il campo di
visibilità dei membri in esse contenuti. I campi di visibilità disponibili
sono: Private, Protected, Public, Published,
Automated.
Tutti i membri che si trovano all'interno di una sezione Private sono
invisibili dall'esterno della unit o programma in cui la classe viene dichiarata. Vengono
normalmente dichiarati in questa sezioni i campi della classe.
Tutti i membri che si trovano all'interno di una sezione Protected
sono visibili ed accessibili all'interno della unit o programma in cui la classe viene
dichiarata e all'interno di qualsiasi classe discendente indipendentemente dal modulo in
cui è dichiarata.
Tutti i membri che si trovano all'interno di una sezione Public sono
visibili ed accessibili da qualsiasi punto sia possibile referenziare la classe stessa.
Tutti i membri che si trovano all'interno di una sezione Published
hanno la stessa visibilità dei membri Public con la differenza che il
compilatore genera per questi le informazioni RTTI (Informazioni Runtime di Tipo)
che lo stesso Delphi utilizza in fase di sviluppo per accedere per esempio alle proprietà
dall'Object Inspector. Queste informazioni infatti permettono ad un'applicazione di
interrogare i campi per ottenerene in modo dinamico i metodi. Non tutti i tipi di dati
possono essere utilizzati in una sezione Published; tipi validi sono:
tipo ordinal, string, class, interface, puntatori a metodi. Anche i tipi Set possono
essere utilizzati a condizione che questi possano essere contenuti in un Byte o in una
Word o in una DoubleWord.
Tutti i membri che si trovano all'interno di una sezione Automated
hanno la stessa visibilità dei membri Public con la differenza che le
informazioni di tipo Automation vengono generate solamente per i membri automated. Per la
trattazione di questo tipi di sezione si rimanda alla guida del linguaggio.