Newsgroup: it.comp.lang.visual-basic
Titolo: Eventi, classi ed interfacce

Poniamo che abbia creato delle classi che espongono, tra le altre cose, 
anche degli eventi. Ovviamente, da codice per gestire questi eventi 
istanzio le mie classi con la keyword 'WithEvents', e tutto funziona.
Se invece definisco un'interfaccia, in modo che le classi abbiano una 
'faccia' comune, come devo comportarmi con gli eventi?
Esempio: Interfaccia I (che, alla fin della fiera, e' una classe)
Classe C1: nella sezione 'Declaration' metto 'Implements I'
Classe C2: nella sezione 'Declaration' metto 'Implements I'
Codice: creo una collection di elementi generici I.
Come faccio ad intercettare gli eventi esposti dalle classi C1 e C2? 
Devo ridefinirli anche in I?
Grazie!
Bye by SixaM 8-]


In teoria sě, tieni conto che gli eventi non si possono "ereditare" con
Implements.
Una soluzione piů elegante sarebbe definire un'altra interfaccia (chiamiamola
"ICallback") che definisce metodi da usare nelle classi C1 e C2 al posto degli
eventi (es. "MyEvent").
L'interfaccia I dovrebbe esporre un metodo ("Register") per passare alle classi
C1 e C2 il riferimento ad un'istanza di una classe che implementa ICallback.
Che altro non č che la classe/form che deve "ricevere" gli eventi.
Es: in un Form
Implements ICallback
Private obj As I
Private Sub ICallback_MyEvent()
    ...
End Sub
Private Sub Form_Load()
    Set obj = New C1
    obj.Register Me
End Sub
HTH
Bye
Raf
-----------------------------------------------------
Funk: cooler than the other side of the pillow.

 ridefinirli anche in I?
Ma non li avevi definiti proprio in I per renderli disponibili in C1 e C2?
Non ho capito la domanda :) 

 Ma non li avevi definiti proprio in I per renderli disponibili in C1 e C2?
E' qui che mi impappino... Se definisco gli eventi nell'interfaccia, poi 
come faccio a scatenarli dalle classi che implementano l'interfaccia?
Bye by SixaM 8-]

 come faccio a scatenarli dalle classi che implementano l'interfaccia?
VB6 è un'obbrobrio per la gestione delle interfacce.
L'unica cosa che puoi fare è:
- dichiarare l'evento nell'interfaccia
- implementare l'interfaccia nella classe
- dove usi la classe devi dichiararla come interfaccia:
Dim WithEvents classe As IMiaInterfaccia
...
Set classe = new MiaClasse
Ciao 


Non puoi: come gią detto l'ereditarietą degli eventi definiti in una classe
base (o interfaccia) non esiste in VB6.
(in generale VB6 non supporta l'ereditarietą *dell'implementazione*)
Al massimo puoi utilizzare un sotterfugio basato sulla "delegation":
- nella classe base (interfaccia) definisci dei metodi Friend che "mappano"
gli eventi:
Public Event MyEvent()
...
Friend Sub RaiseMyEvent()
    RaiseEvent MyEvent()
End Sub
- in ognuna delle classi derivate definisci una "copia privata" di un
oggetto della classe base e lo fai "vivere" di pari passo alla classe:
Private mBaseClass As IMyInterface
Private Sub Class_Initialize()
    Set mBaseClass = New IMyInterface
End Sub
Private Sub Class_Terminate()
    Set mBaseClass = Nothing
End Sub
- Quando devi scatenare un evento da una classe derivata richiami il
relativo metodo Friend della classe base
...
    mBaseClass.RaiseMyEvent
Letture consigliate:
http://www.stardeveloper.com/articles/display.html?article=2001082201&page=1
http://msdn2.microsoft.com/en-us/library/aa260821(VS.60).aspx
Bye
Raf