Newsgroup: it.comp.lang.delphi
Titolo: interfacce

Ciao a tutti.
Ho qualche problema circa le interfacce. Avendo lavorato in java non 
sono abituato alla necessita di UUID addref ecc.
in gava tra l'altro c'e' la garbage collection.
Ora mi trovo a dover implementare un pattern Composite e mi chiedevo se 
a parer vostro conviene simulare un interfaccia con una classe astratta 
in cui tutti i metodi sono astratti o usare un'interfaccia vera con i 
problemi che comporta in termini i UUID ecc.
Grazie
Ing Giuseppe Monteleone


Hai toccato un tasto dolente: anche secondo me a delphi manca una 
gestione delle interfacce piu' simil-java e meno simil-COM...
Usare una classe astratta non te lo consiglio: delphi non ha 
l'ereditarieta' multipla, quindi non riusciresti a definire classi che 
possano 1-implementare piu' interfacce e 2-derivare da qualcos'altro che 
non sia la tua classe astratta. Poi vedi tu, dipende sempre dalle tue 
esigenze, magari ti puo' andar bene lo stesso!
C'e' un modo per convivere "pacificamente" con le interfacce in delphi: 
dovresti derivare tutte le tue classi da TComponent, in cui addref 
eccetera sono gia' definite e non fanno niente, quindi non devi 
reimplementarle tu. Cosi' pero' ti perdi la GC delle interfacce COM.
ciao
Giacomo

l'ereditarieta' multipla,
In generale, usare una classe astratta va benissimo. La MI è usata in
casi abbastanza rari.

 problemi che comporta in termini i UUID ecc.
Prova a vedere il codice usato dalla GOF, poi facci sapere se fa al caso
tuo:
http://www.felix-colibri.com/papers/design_patterns/gof_design_patterns/gof_design_patterns.html
Ciao
-- 
Morde


Dipende come sempre da cosa devi fare: se il tuo scopo e' sostituire le
interfacce con altrettante classi astrattte, non e' proprio possibile
realizzare una classe che ne estende un'altra e contemporaneamente
implementa un'interfaccia se non hai l'ereditarieta' multipla.
Se le tue classi non estendono mai classi preesistenti e devono 
implementare una sola interfaccia alla volta allora vanno benone anche 
delle classi astratte al posto delle interfacce.
ciao
Giacomo

 delle classi astratte al posto delle interfacce.
Giacomo, ripeti le stesse cose. Quello che dici è, in sostanza, che se hai
bisogno di ereditarietà multipla allora non puoi usare le classi astratte;
se non ne hai bisogno puoi farlo. 
Ripeto anche io la mia risposta: le classi astratte vanno bene nel 90% dei
casi e forse più, perché la stragrande maggioranza delle volte,
dell'ereditarietà multipla si può fare a meno.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 dell'ereditarietà multipla si può fare a meno.
In tutta sincerità: quando lavoraro in c++ mi sembrava di non poter fare a
meno di ereditare da più interfacce... da quando lavoro in delphi mi riesce
difficile pensare che si abbia la necessità di fare derivazioni multiple.
Secondo me, l'eredità singola è più pulita, ed evita pericolosi
accoppiamenti. La mia esperienza sul campo mi ha insegnato questo.
-- 
Morde

 accoppiamenti. La mia esperienza sul campo mi ha insegnato questo.
In programmazione sono utili sia l'ereditarietà singola che quella
multipla.
Il C++ è semplicemente un linguaggio più potente, ma non vuol dire che
l'ereditarietà multipla sia da usare con disinvoltura. Il fatto che tu ne
sentissi così spesso l'esigenza è preoccupante. Come minimo mi fa pensare
che i ruoli delle classi base non fossero ben definiti.


 che i ruoli delle classi base non fossero ben definiti.
Ho dovuto ricorrere all'ereditarietà multipla nello scrivere un driver per
alcune stampanti che si usavano allora, laserjet et simila.
Ricordo (ormai sono passati 8 anni) che allora avevo ereditato da classi
basi di tipo iframe, igraphic, ecc.. insoma avevo costruito delle stampe
con grafici a barre e a torta ecc.. Oggi, forse, non ci sarebbe più questa
esigenza ma ricordo che a quei tempi il tempo era poco, la documentazione
tecnica per i driver era scarsa (programmavo con visualage per OS/2) e le
api per disegnare le stampe erano tutte di basso livello (mi ricordo
gpibitbuilt ecc..)
-- 
Morde