Newsgroup: it.comp.lang.visual-basic
Titolo: Gerarchia di ereditarieta' in VB

Questo e' un quesito per esperti di programmazione ad oggetti in VB
Supponiamo che io abbia una interfaccia di nome IDraw (fra cui, ad esempio,
un metodo Select() ).
La classe Operator implementa l'interfaccia IDraw e fornisce anche nuovi
metodi (non e' piu' una classe astratta, ho fornito il codice per diversi
metodi, fra i quali il metodo IDraw_Select() , ereditato da IDraw)
Io vorrei creare una terza classe, OpUnion diciamo, che erediti da Operator
tanto l'interfaccia quanto l'implementazione, usando la delegation (eredito
l'intefaccia di Operator e inserisco un oggetto Operator privato nella
classe OpUnion, quindi delego i metodi dell'interfaccia di Operator a tale
oggetto). Il problema e' che VB si lamenta che non ho implementato il metodo
IDraw_Select() dell'interfaccia Operator... quando in realta' il metodo c'e'
eccome! Ho anche provato a dichiararlo in modo diverso, ad esempio come
Operator_IDraw_Select (seguendo la convenzione del VB per i metodi
ereditati)... ma non ha funzionato...
C'e' qualche guru che sa dirmi se si puo' fare, oppure se devo adattarmi a
passare ad un linguaggio di programmazione "vero" (C++,Java)? (Scherzo, in
effetti con qualche sotterfugio dovrei cavarmela anche con VB, ma l'idea di
appiattire ad un solo livello una gerarchia di ereditarieta' a quattro piani
non mi va molto a genio).
Grazie a chiunque sia in grado di fornire qualunque genere di suggerimento.
Aime Andrea

> ... usando la delegation ...
se inserisci l'oggetto, non aggiungere anche la
keyword "Implements"; otterrai quello che vuoi e
VB non si potra' lamentare.
Saluti
Roberto

Oppure:
se usi implements devi ridirigere le proprietą, i metodi e gli eventi
della classe derivata sull'oggetto che hai inserito.
es:
Implements PersonalData
Private [Withevents] PD as [New] PrsonalData
Private Property Get PersonalData_Address() As String
    PersonalData_Address = PD.Address
End Property
Private Property Let PersonalData_Address(ByVal RHS As String)
    PD.Address=RHS
End Property
ecc...
Tieni conto che in VB l'ereditarieta', quella vera, non e' supportata.
Saluti
Roberto

...

Beh, quello che hai scritto qui e' una tecnica che si chiama delegation.
Rispetto alla tua prima mail, devo osservare che se non metti la keyword
implements non puoi sfruttare il polimorfismo, senza il quale di fatto le
interface non servono a nulla! Io vorrei fare in modo di dichiarare una
classe A, una classe B che implementa l'interfaccia di A, una classe C che
implementa l'interfaccia di B e ne riusa i metodi con la delegation, in modo
che in una collezione di A si possano inserire anche B e C usando l'early
binding per le chiamate...
(altrimenti potrei dichiarla come collezione punto e basta e lasciare che VB
perda un sacco di tempo con il late binding)... per me la velocita' e'
abbastanza importante, visto che sto scrivendo un editor grafico...

Questo e' quello che offre VB :-(
Ciao
Roberto


Mi dispiace disilluderti ma se usi le Collection di VB hai *sempre* il late
binding!
Ho dei problemi a disallocare delle Collection (La garbage ci mette un sacco
di tempo)
e mi sono documentato:
Le Collection utilizzano 16 byte per ogni oggetto perchè lo considerano
Variant!!
A meno che non utilizzi delle Collection fatte in casa con delle matrici di
oggetti e
il ReDim quando serve non hai l'early binding.
Dal manuale di VB --
CAPITOLO 9 -- "Programmazione ad oggetti"
paragrafo "Composizione di un oggetto Collection"
Ciao Salvatore