lunedì 8 dicembre 2014

Gestori di eventi e delegati.

Nell'ambito di una classe è dichiarato l'evento, con il nome preceduto dall'handler.
    class altraClasse
    {
        public event mioHandler Evento;

    }
che ancora mi dà errore perché quel mioHandler non significa ancora nulla.

Nell'ambito della stessa classe viene dichiarato il delegato, ossia l'handler.
Cerchiamo di interpretare con parole "umane": l'evento viene dichiarato con il nome dell'handler.
L'handler, essendo dichiarato come delegato, esprime la sua firma, ossia il numero e il tipo di parametri. Questo significa che quel dato evento può essere gestito solo da funzioni che abbiano quella firma.
Quindi con la dichiarazione del delegato noi non facciamo altro che esprimere il fatto che quel gestore di eventi, che gestisce quel dato evento, può essere espressione soltanto di funzioni con una determinata firma.
Proviamo:
    class altraClasse
    {
        public event mioHandler Evento;

        public delegate void mioHandler();

    }
Ecco, il mio handler, o delegato, non ha parametri.
Più semplice di così...

Ora, però, mettiamo nella nostra classe una funzione che evochi l'evento...
    class altraClasse
    {
        public event mioHandler Evento;

        public delegate void mioHandler();

        public void Evoca()
        {
            Evento();
        }

    }
Bene.

Ora dalla classe principale proviamo a istanziare questa classe.
        public static void Main()
        {
            altraClasse cs = new altraClasse();
            
        }
Ora, dopo che nel contesto dell'altra classe è stato stabilito che l'evento va gestito da una funzione avente la firma definita dall'handler (delegato), in questa classe si sostituisce al delegato una funzione esistente che abbia la stessa firma, ossia Scrivi().
        public static void Main()
        {
            altraClasse cs = new altraClasse();
            cs.Evento += new altraClasse.mioHandler(Scrivi);
            cs.Evoca();
        }
Quindi si evoca l'evento, e funziona.

Bene. Dunque nella classe che esprime l'evento si esprime, tramite il delegato/handler, il tipo di funzione che dovrà gestire l'evento. Punto.
Poi, in un'altra classe, si può verificare l'evento associando all'evento una funzione che abbia la giusta firma.

Spero di aver capito...

Nessun commento:

Posta un commento