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

Ciao a tutti.
Come gia detto poco termpo fa sono "costretto" a usare i COM.
Il problema che ho,  sicuramente derivato dalla mia scarsa conoscenza
di questa tecnologia è il seguente.
Ho la necessita di usare metodi virtuali di cui fare l'override in un
discendente di un com.
Smanettando con google ho trovato alcuni msg di un ng in inglese
dedicato a delphi specifico per cio che riguarda com.
Leggendo qua e la credo di aver capito che la tecnica da seguire
consiste nel non far ereditare i COM da TAutoObject ma da
TAutoIntfObject...
Ok.
Ho creato un com "radice":
  TRootItem = class(TAutoIntfObject, IRootItem)
  protected
    procedure load; virtual; safecall;
...
rimuovendo le righe autogenerate dal wizard per la registrazione:
//initialization
//  TAutoObjectFactory.Create(ComServer, TRootItem, Class_RootItem,
//    ciMultiInstance, tmApartment);
Poi creo un secondo com:
  TFirstDerivatedItem = class(TRootItem, IFirstDerivatedItem)
  protected
    procedure load; override; safecall;
  end;
Ovviamente, le righe seguenti mi provocano un errore di compilazione:
initialization
  TAutoObjectFactory.Create(ComServer, TFirstDerivatedItem,
Class_FirstDerivatedItem,
    ciMultiInstance, tmApartment);
in quanto la stramaledetta classe TAutoIntfObject non è polimofrica
rispetto a TAutoObject.
Ora, scusandomi in anticipo se ho scritto cazzate, chiedo se qlc del ng
puo' rispondere a queste domandine...
1) Quello che sto tentando di fare e' realizzabile oppure e' meglio che
lascio perdere?
2) Se la cosa è realizzabile, esiste una tecnica alternativa a questa?
3) Se la tecnica e' giusta, qualcuno mi sa indicare errori o
eventualmente links ad articoli che spieghino queste cose?
Finora ho trovato questi riferimenti:
http://groups.google.it/group/borland.public.delphi.oleautomation/browse_thread/thread/bf8fd54bac3e6e37/f68a3f56792b9348?lnk=gst&q=TAutoIntfObject&rnum=1#f68a3f56792b9348
http://groups.google.it/group/borland.public.delphi.oleautomation/browse_thread/thread/88662168175539d6/ac95b8bc2f9cc0bd?lnk=gst&q=TAutoIntfObject&rnum=4#ac95b8bc2f9cc0bd
http://groups.google.it/group/borland.public.delphi.oleautomation/browse_thread/thread/75ab3b6b2da068ea/b371877e2410286e?lnk=gst&q=TAutoIntfObject&rnum=5#b371877e2410286e
http://groups.google.it/group/borland.public.delphi.oleautomation/browse_thread/thread/b0c2a888e35c69a7/282252a4fade31d6?lnk=st&q=TAutoIntfObject+registering&rnum=1#282252a4fade31d6
http://www.techvanguards.com/com/tutorials/objecthierarchies.asp
A.

 discendente di un com.
Ammetto che, per problemi di tempo, non ho letto tutte le risorse che 
hai elencato, ma se la memoria non m'inganna COM *non* supporta 
l'ereditarietà classica che tutti conosciamo, cioè non puoi derivare una 
classe COM da una classe COM esistente. :-/
Temo che qualsiasi riutilizzo debba avvenire dietro il concetto della 
"composizione".
Non so se questa risposta ti sarà utile. :-)
Ciao,
   Marco.
-- 
MARCO BREVEGLIERI
  (
http://www.marco.breveglieri.name
)

   Marco.
Andrea

 Solo qualche idea... :D
Proprio perché COM non supporta i meccanismi di cui sopra, le uniche vie 
alternative sono queste: sfruttare l'OOP "internamente", esponendo 
tramite classi COM solamente dei "wrapper" alla logica implementata con 
le classi Delphi. In sostanza, quando si tratta di classi COM, agisci 
per composizione.


 per composizione.
Come detto prima, se erediti da TAutoObject e ti fai le tue belle
classettine, queste sono comunque in relazione di ereditarietà,
anche se per COM non è così e non hai bisogno di composizione.
Claro il mio pensiero? :D
Andrea

 Claro il mio pensiero? :D
Sì, il tuo pensiero mi è chiaro, ma vorrei che fosse chiaro anche il mio.
La soluzione che proponi è ovviamente valida, ma è ereditarietà tra 
classi Delphi, infatti funziona solamente in casi specifici.
Nessuno mette in dubbio che una classe che implementa un'interfaccia COM 
in Delphi possa ereditare da altre, ma non corrisponde a ciò che si 
intende per "ereditare una classe COM", o comunque è necessario scindere 
le due cose, che è quanto sto cercando di dire, probabilmente senza 
spiegarmi.
Crea un server con oggetti COM in Delphi e, senza fare riferimento alla 
unit di quella classe, crea una classe che derivi da questa.
Oppure, crea una classe COM che derivi da una classe COM esistente, ma 
implementata in un altro linguaggio...
In conclusione, non è che non ho compreso quanto stai dicendo o che stia 
contestando le tue soluzioni per risolvere il problema (che potrebbero 
essere senz'altro utili ad Alberto... che non si fa però più sentire), 
sto solo sottolineando che - nonostante le parole differenti - stiamo 
dicendo la stessa cosa. :-D


 essere senz'altro utili ad Alberto... che non si fa però più sentire),
Non sto "solo" sviluppando, in questo periodo...
Sto facendo anche altre cose che mi tengono lontano dalla tastiera. :-D
Ho letto i vs msg e ho capito cosa volete dire entrambi, anche xche
dopo aver postato ho ovviamente approfondito la questione.
Da un punto di vista "delphi" (x gli altri non so e non parlo...)
quando crei un COM viene creata ovviamente l'INTERFACCIA, e poi viene
creata una classe delphi che di default eredita da TAutoObject e
IMPLEMENTA l'interfaccia stessa.
Ora, L'interfaccia la puoi associare alla property ParentInterface di
un altro COM.
Questo comporta che in automatico questa seconda interfaccia sara'
polimorfica rispetto a quella parent e avra' disponibili i metodi
dichiarati dal parent stesso ma SOLO come dichiarazione.
Quindi, non potrai, a questo livello, scrivere "inherited" dentro la
implementazione del metodo fatta nel discendente in quanto
l'interfaccia NON HA IMPLEMENTAZIONE.
L'altro aspetto è la classe delphi, che essendo una CLASSE puo' avere
la implementazione dei metodi. Ergo, se erediti da questa classe puoi
scrivere nel discendente "inherited" metododelpadre e il discendete
sara' cmq polimorfico rispetto alla interfaccia.
Cmq, sono VERAMENTE contento che zio billy metta la tecnologia com in
soffitta....
Detesto il fatto che se usi com esci da un contesto realmente OO.
Il giorno che mi saro' lasciato alle spalle tutti questi casini mi
organizzo una megafesta come dico io...! :-))))
A

 organizzo una megafesta come dico io...! :-))))
Ci inviti entrambi? :-D


Azz! Come no!
Basta che portiate ognuno un paio di "amiche".... :-))))
A.

questo senso l'ereditarietà c'è.
Non proprio.  Come al solito, intervieni nelle discussioni per
aggiungere solo un consistente strato di confusione legato ai giochi
astrusi che proponi di fare col linguaggio.
Che cosa stai dicendo, di grazia ?!
Dire "una classe COM può essere ereditata in Delphi" non vuol dire una
benemerita cippa: o parli di CoClass o parli di classe Delphi e le
classi COM **NON** hanno eredità di implementazione, ma solo di
interfaccia.  L'implementazione va riscritta.

 interfaccia.  L'implementazione va riscritta.
io intendevo dire prp questo.
Forse la mio post si evince altro?
AS