Newsgroup: it.comp.lang.delphi
Titolo: Non ho molto chiara l'allocazione di oggetti...

    	Ciao! Sono un "vecchio" programmatore Pascal, + precismente di Turbo 
Pascal. L'ultima versione di TP che ho usato č stata la 7. Da qualche tempo ho 
"scoperto" Delphi, precisamente uso la versione 2.0 lo so che non č la + 
recente ma credo che per i programmi che devo svilippare sia + che 
sufficiente. Con grande piacere noto che la struttura di Delphi č simile, 
se non identica per certi versi, alla gerachia TurboVision (us sitema a 
finestre testuali sviluppata per TP).
 
    	Con entusiamo mi procuro il Libro di Cantů: "Delphi 2.0". Un buon libro, 
fatto abbastanza bene... perň... ci sono alcuni punti che non ho ben 
comrpeso... Quello che + mi ha disorentato č quello relativo alla creazione 
degli oggetti, pardon: delle istanze, mi spiego...
    	Supponiamo che abbia creato, sotto Delphi, la segunete classe:
    	type
    	   mia_classe = class
    	    	procedure ciao;
    	   end;
    	da quello che c'č scritto sul libro, la classe che ho appena crato č 
discendente da TObject, cioč č come se avessi scritto:
	  type
    	   mia_classe = class(TObject)
    	    	procedure ciao;
    	   end;
    	E' Vero?
    	Cmq continuiamo... per creare un'istanza di questa classe devo procedere 
in questo modo:
    	var
    	  mio_oggetto : mia_classe;
    	Begin
    	 .
    	 .
    	 .
    	 mio_oggetto := mia_classe.Create;
    	 .
    	 .
    	 .
    	End;
    	a questo punto penso: "ma il caro vecchio constructor dov'č finito?". 
Cantů mi viene in aiuto dicendo che per creare e inizializzare un oggetto si 
puň usare un anche construcor (che nella maggior parte dei casi si chiama 
init).
 
    	Ne mostra anche l'utilizzo, che č identico a quello di Create, ma 
allora... se hanno lo stesso significato perchč usare due modi diversi per dire 
la stessa cosa? 
    	Per caso il constructor richiama automanticamente il metodo Create?
    	Il metodo Create allocca automanticamente un oggetto sulla memoria?
    	Insomma qualcuno puň darmi delle delucidazioni consistenti sul concetto di 
oggetto sotto Delphi?
    	    	Grazie ancora.

Gli oggetti di delphi hanno determinate caratteristiche che sono
fondamentalmente tre:
ereditarietà, polimorfismo, incapsulamento.
La caratteristica più rilevante è l' ereditarietà, per cui derivando una
classe erediti i metodi e le variabili istanza della classe ancestor. Così,
la chiamata a Create, che è un metodo, viene indirizzata al metodo della o
delle classi ancestor. Puoi anche utilizzare la parola chiave CONSTRUCTOR
nel caso volessi sovrascrivere il metodo Create della classe padre per un
qualche tuo scopo.
Per farti capire meglio:
Questa è la tua dichiarazione di mia_classe:
   type
        mia_classe = class(TObject)
         procedure ciao;
        end;
In sostanza crei un oggetto discendente da TObject con un nuovo metodo
chiamato ciao.
Avresti anche potuto scrivere così:
   type
        mia_classe = class(TObject)
         constructor Create; override;
         destructor Destroy; override;
         procedure ciao;
        end;
poi, nella sezione implementation...
   constructor Create;
   begin
          inherited Create;
   end;
   destructor Destroy;
   begin
          inherited Destroy;
   end;
   procedure Ciao;
   begin
    ....
   end;
ottenendo lo stesso scopo. In questo modo hai sovrascritto esplicitamente i
metodi create e destroy, dicendogli semplicemente di chiamare i metodi
corrispondenti dell' ancestor. La differenza sta nel fatto che ora, all'
interno di questi metodi esplicitamente implementati puoi far
creare/distruggere altre variabili od oggetti a seconda di ciò che  la
classe deve fare o contiene.
Spero di esserti stato di aiuto...
Ciao.
Marco Soravia
Sviluppo software gestionale
E-MAIL: 
vj...@libero.it

     	Il metodo Create allocca automanticamente un oggetto sulla memoria?
si'
oddio, amenoche' non si erediti facendo l'override del create
senza richiamare il create ereditato:
contructor Create; override;
begin
 .... // senza inherited Create;
end;
Spero di esserti stato d'aiuto, ciao!
Alan Solo


non voglio dire cavolare (sto ancora dormendo), ma penso che per init possa
far riferimento "InitInstance" che azzera tutti i valori.
ciao

: 

    	No... hai soppravvalutato il mio problema ;) Il fatto è che in TP 7 le 
istanze, diciamo gli oggetti veri e propri, possono essere statici, cioè 
fare parte della memoria in modo statico, o dinamici, cioè possono essere 
alloccatti in memoria a run-time. Con Delphi ho scoperto, grazie anche alle 
due persone che gentilmente hanno risposto al mio post, TUTTI gli oggetti, 
o meglio le istanze, sono alloccate dinamicamente, l'unica cosa di statica 
è il puntatore a questi oggetti!!!
    	Cmq Grazie!

         constructor Create; override;
Questo no, perche' Create e' statico (lo dico solo per non far
confondere rough ancora di +)
Ciao
--
Piero Bonanno
bop...@libero.it
pie...@tiscalinet.it
bop...@tin.it
bpie...@hotmail.com
______________________________________________
"Madame, lei ha tra le gambe uno strumento
che puo' offrire piacere a migliaia di persone,
e tutto quello che sa fare e' grattarlo"
- Sir Thomas Beechan a una violoncellista

 confondere rough ancora di +)
scusami, icsche' no?

Mi hai fatto venire un dubbio, per cui ho consultato la guida in linea di
Delphi, sempre particolarmente esaustiva e chiara, nella quale si dice che
per default tutti i metodi sono statici e che l' override si fa solo con i
metodi precedentemente dichiarati VIRTUAL o DYNAMIC.
La tua affermazione sembra quindi essere corretta, ammesso che il metodo
Create sia lasciato come STATIC, ma nulla vieta che invece sia stato
implementato come VIRTUAL o DYNAMIC, nel qual caso l' overriding č d'
obbligo [Il compilatore non lo considera errore, ma emette un messaggio di
warning].
In veritą non ho mai approfondito particolarmente questi aspetti, per cui
potrei sbagliare... nel caso sarņ felice di eventuali chiarimenti. Imparare
fa sempre bene...


warning].
Veramente non ho fatto molte prove. Ho solo tentato di ridefinire
Create con override e ho ricevuto un msg d'errore.


scusami, icsche' no?
Penso perche' viene risolto a tempo di compilazione. Cmq, se provo a
ridefinire Create con la direttiva override, viene fuori l'errore che
ho detto.


 Imparare fa sempre bene...
mi associo, sono disponibile anch'io ;)
Ciao,
Alan Solo