Delegate ed eventi in interfacce generics

martedì 09 marzo 2010 - 18.45

Teech Profilo | Expert

Ho un'interfaccia che indica che la mia classe è "Filtrabile" così composta (dove F indica il mio filtro):
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Non riesco ad implementare l'interfaccia nella classe:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
Mi viene restituito che i delegati non corrispondono: perchè? Come posso fare? Grazie dell'aiuto!!!
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

aiedail92 Profilo | Expert

Ciao Maurizio

Stai cercando di implementare l'interfaccia per un tipo che non è il suo: nell'interfaccia dichiari che il delegato ShowFilterHandle prende come parametro un oggetto di tipo F:

>Delegate Sub ShowFilterHandler(ByVal sender As F, ByVal e As ComponentModel.CancelEventArgs)

Poi quando implementi l'interfaccia hai F = MioFiltro:

>Implements IFiltrable(Of MioFiltro)

Ma appena dopo cerchi di imporre F = Schema.IAgentsFilter

>Delegate Sub ShowFilterHandler(sender As Schema.IAgentsFilter, e As ComponentModel.CancelEventArgs)
>Public Event ShowFilter As ShowFilterHandler Implements Collection.IFiltrable(Of Schema.IAgentsFilter).ShowFilter

Da cui l'errore di non corrispondenza dei tipi.

Luca

Teech Profilo | Expert

Ops... Purtroppo quello è solo un refuso di un Copia/Incolla fatto qui sul forum (chiedo venia): ho cambiato i nomi per semplificare la lettura del codice.
La classe si dovrebbe presentare così:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
Già il fatto di mettere il Delegate sia nell'interfaccia che nella classe che la implementa mi sembra una cosa strana. Non ho però trovato nulla a riguardo sul Web. Qualcuno può chiarirmi dove sbaglio?

Grazie!!!
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

aiedail92 Profilo | Expert

Ok, adesso il problema è che ridefinisci il tipo del delegato. Il fatto che abbia lo stesso nome e la stessa signature, non fa di lui lo stesso tipo (è nestato in una classe diversa).

In pratica devi rimuovere questa riga:

Delegate Sub ShowFilterHandler(ByVal sender As MioFiltro, _ ByVal e As ComponentModel.CancelEventArgs)

E sostituire la seguente con quest'altra:

Public Event ShowFilter As IFiltrable(Of MioFiltro).ShowFilterHandler _ Implements IFiltrable(Of MioFiltro).ShowFilter

Luca

Teech Profilo | Expert

Riposta decisamente chiara ed esaustiva. Mille grazie!!!
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5