Newsgroup: it.comp.lang.delphi
Titolo: Suddivisione delle classi in diverse unit.

Salve! Vi pongo un quesito. Mettiamo che io ho due classi, e vorrei
dichiararle su due unit diverse. Sfortunatamente, ciascuna delle due ha un
campo che corrisponde all'altra:
type
TA=class
 b:TB;
end;
TB=class
 a:TA;
end;
E' possibile metterle sulla stessa unit, mettendo come prima linea TB=class;
(forward declaration).
Ma esiste un modo per metterle su due unit diverse ? Io ho provato ma non mi
riesce..
Grazie a chi mi aiuta!                                                {MSX}
--
{MSX}  -  
http://msx.rules.it
Mantenitore delle FAQ di it.comp.lang.delphi,
reperibili qui: 
http://gpi.infomedia.it/abc/delphi/FaqDelphi.txt

 riesce..
 
Non voglio fare l'avvocato del diavolo, ma sarei molto curioso
di sapere xche vuoi usare 2 unit diverse.
Nel tuo caso non dico che è obbligatorio, ma poco ci manca.
Se hai 2 unit separate corri il rischio di beccarti una circular reference.
Non credo vi sia un altro modo.
AS
-- 
Posted from  [212.17.220.41] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 campo che corrisponde all'altra
Nutro il forte sospetto che tu stia sbagliando qualcosa
nella progettazione delle tue classi.
Gia', accoppiare due classi puo' far storcere il naso, 
ma disporre questa dipendenza tra due unit indipendenti 
e' veramente troppo :)
Spiega meglio quello che vuoi fare, forse c'e' una
soluzione migliore.
-- 
Posted from  [80.105.34.80] 


 soluzione migliore.
Rispondo anche ad Alberto:
Vorrei usare due unit per usare appieno l'information hiding delle classi.
Ho notato infatti (e mi sono abbastanza stupito), che data una classe A,
qualsiasi procedura o metodo esterni ad A dichiarati nella stessa unit di A,
possono accedere ai campi privati di A!! (spero di essermi spiegato pur non
usando l'italiano :)
Praticamente posso accedere ai campi privati di una classe se sono nella
stessa unit. Questo mi pare molto brutto, per cui volevo mettere le classi
in unit diverse. E fin qui ok :)
Solo che due (o piu') di queste classi hanno riferimenti incrociati.. In
particolare una e' classe A e' un "contenitore" di altre classi B (quindi
ovviamente deve "conoscere" B), ed ogni classe B ha un riferimento al suo
contenitore A. Questo e' il nocciolo del problema..
In teoria una soluzione sarebbe tralasciare il riferimento di A in B, ma
allora dovrei sempre riportare l'oggetto A dove ho bisogno di conoscere il
contenitore di un oggetto.. insomma un casino!
Voi come fareste ? Considerate che io faccio grande uso di questi
"contenitori", quindi e' un problema abbastanza basilare..
Grazie ancora!

 Ma esiste un modo per metterle su due unit diverse ?
No (afaik). A meno di dichiarare
TB = class
  a: TObject;
end;
usare la unit di TA nella implementation e li' ogni volta che si accede
a TB.a fare gli opportuni cast.
Saluti
Paolo Arosio

contenitore A. Questo e' il nocciolo del problema..
Spiegati meglio: di che tipo di contenitore hai bisogno ?
-- 
The Follet

> Spiegati meglio: di che tipo di contenitore hai bisogno ?
Si tratta di una classe che incapsula un array dinamico di oggetti (di tipo
TB). La classe mette a disposizione alcune funzioni, tipo Add, Delete ecc
per aggiungere, togliere, spostare ecc ecc valori dell'array. Inoltre ha
altri metodi che permettono, ad esempio, la ricerca di elementi in base a
vari criteri, di fare operazioni su tutti (o alcuni) gli elementi e cose
simili..
Ad esempio ho una classe che contiene un array dinamico di classi che
rappresentano le connessioni di un server. Si possono aggiungere o togliere
(se un client si connette/disconnette), si possono consultare per vedere lo
stato, ecc.
C'e' ad esempio un metodo che manda un messaggio a tutti i client connessi.
Connessioni.InviaATutti(s:string);
oppure
Connessioni.Connessione[2].Invia(s:string);
Non saprei come altro implementare una cosa cosi'.. forse con i TCollection,
ma non mi piacciono molto..
Che ne dite ?

simili..
TObjectList e' una classe predefinita.
Dall'help:
Use a TObjectList to store and maintain a list of objects.
TObjectList provides properties and methods to add, delete,
rearrange, locate, access, and sort objects. If the
OwnsObjects property is set to True (the default),
TObjectList controls the memory of its objects, freeing an
object when its index is reassigned; when it is removed from
the list with the Delete, Remove, or Clear method; or when
the TObjectList instance is itself destroyed.
-- 
The Follet

ma non mi piacciono molto..
Anche a me non piacevano, ma poi ho provato ad usarle ed ora le trovo
molto comode. Le uso spesso quando devo passare array dinamici di dati
complessi (tipo record od oggetti) tra un client ed un server.
Ciao, Rocco.

 contenitore A. Questo e' il nocciolo del problema..
Se devo avere una lista di TOperatoreMacchina la dichiaro nella unit
dove dichiaro TOperatoreMacchina. Se invece voglio una lista di
TChissaCosaCEDentro uso una TList.
Alternativamente, "usa delle interfacce" (mo' so @@@@@@@@ tua).
v. anche borland.public.delphi.oodesign.
Saluti
Paolo Arosio

"contenitori", quindi e' un problema abbastanza basilare..
Nei T&T sul sito di Marco Cantu' c'e' una sokuzione al problema. Si
tratta di passare alle interfacce. Altrimenti dovresti usare TObject
nella parte interface e un bel cast statico, magari con un Assert
nella parte implementation
Ciao
--
Piero Bonanno
bop...@libero.it
pie...@tiscalinet.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