VB 2010 – Covarianza e Controvarianza

Spiegare i concetti relativi alla varianza generica non è semplicissimo, soprattutto con l’uso di termini come Covarianza e di Controvarianza, e presuppone una conoscenza abbastanza approfondita della programmazione orientata agli oggetti, ma ci proveremo con qualche esempio.

Covarianza e Controvarianza sono, appunto, due aspetti distinti e complementari della Varianza generica, nell’ambito dell’ereditarietà in una gerarchia di classi.

Iniziamo con la Covarianza: supponiamo di avere un oggetto di tipo Insalata e un oggetto di tipo Carota e di voler assegnare questi oggetti a un oggetto di tipo Verdura. Per la programmazione orientata agli oggetti questo dovrebbe essere possibile, visto che Insalata e Carota sono classi che derivano dalla classe Verdura. Tuttavia, fino alla versione 2008 di Visual Basic, questo non era possibile perché era necessario effettuare una conversione esplicita.

In Visual Basic 2010, otteniamo il risultato desiderato dalle classi derivate Insalata e Carota, ma nell’ambito di una collezione di oggetti di tipo astratto Verdura. Questo risultato lo possiamo ottenere solamente utilizzando un’interfaccia IEnumerable(Of Object), dove Object in questo caso viene sostituito dal tipo Verdura.

Vediamo un esempio più semplice con una lista di stringhe:

 

Code Snippet
  1.     ' definisce una lista di stringhe
  2.     Dim listaStringhe As New List(Of String) From
  3.            {
  4.              "Visual Studio ",
  5.              "2010 ",
  6.              "su ",
  7.              "io ",
  8.              "Programmo"
  9.            }
  10.     ' definisce un insieme generico di elementi
  11.     Dim lstCovarianza As IEnumerable(Of Object) =
  12.           listaStringhe
  13.     ' inizializza un oggetto di tipo StringBuilder
  14.     ' per il concatenamento dinamico delle stringhe
  15.     Dim sb As New StringBuilder
  16.     ' ciclo per leggere tutte le stringhe
  17.     ' dall'insieme generico
  18.     For Each lst In lstCovarianza
  19.       ' accoda la prossima stringa letta
  20.       sb.Append(lst)
  21.     Next
  22.     ' visualizza il risultato
  23.     MessageBox.Show(sb.ToString)

 

Nella Controvarianza, il concetto è diametralmente opposto: da una classe derivata Insalata o Carota, ricaviamo il risultato desiderato sfruttando la classe astratta Verdura.

Come nella Covarianza dobbiamo necessariamente utilizzare un’interfaccia IEnumerable, nella Controvarianza utilizziamo i delegati.

Come esempio classico di Controvarianza possiamo citare un metodo per gestire due eventi distinti di un controllo visuale: per esempio gli eventi MouseClick, cioè il normale click con il tasto sinistro del mouse, e KeyUp che avviene al momento del rilascio di un tasto.

Normalmente, questi due eventi ricevono due oggetti diversi: il primo riceve un oggetto di tipo MouseEventArgs, mentre il secondo riceve un oggetto di tipo KeyEventArgs. Si porrebbe, quindi, il problema di gestire questi due diversi tipi di oggetto. Per fortuna, entrambi sono derivati da System.EventArgs ed ereditano quindi tutte le caratteristiche principali da quest’ultimo.

In Visual Basic 2008 possiamo scrivere qualcosa di simile a questo codice:

 

Code Snippet
  1.   ' definisco un metodo comune
  2.   ' per i due diversi eventi
  3.   Private Sub GestoreComune(
  4.             ByVal sender As Object,
  5.             ByVal e As EventArgs)
  6.     ' visualizza un messaggio
  7.     MessageBox.Show("Click o tasto!")
  8.   End Sub
  9.  
  10.   ' questo ? il normale metodo gestore
  11.   ' dell'evento Load di un form
  12.   Private Sub frmMain_Load(
  13.         ByVal sender As System.Object,
  14.         ByVal e As System.EventArgs) _
  15.         Handles MyBase.Load
  16.     AddHandler btnTest.MouseClick,
  17.       AddressOf GestoreComune
  18.     AddHandler btnTest.KeyUp,
  19.       AddressOf GestoreComune
  20.   End Sub

 

 

In Visual Basic 2010 possiamo anche scrivere nella seguente forma alternativa:

 

Code Snippet
  1.   ' funziona solo in VB 2010:
  2.     AddHandler btnMessaggi.KeyUp,
  3.       Sub() MessageBox.Show("Evento KeyUp")
  4.  
  5.     AddHandler btnMessaggi.Click,
  6.       Sub()
  7.         Dim msg As String
  8.         msg = "Evento Click"
  9.         MessageBox.Show(msg)
  10.       End Sub

 

In questo esempio ridefiniamo gli eventi KeyUp e Click, in modo tale che se si verifica il primo evento viene visualizzato "Evento KeyUp", mentre se si verifica il secondo viene visualizzato "Evento Click".

Provate l’esempio e vedrete che le situazioni che potrete incontrare sono diverse. Per esempio, se portate il focus sul pulsante btnMessaggi e premete la barra degli spazi, vedrete apparire in sequenza entrambi i messaggi: questo avviene perché la pressione della barra degli spazi equivale a un click del mouse e quindi scatena l’evento Click, ma scatena anche l’evento KeyUp al momento del sollevamento del tasto. Se fate click con il mouse, vedrete il messaggio "Evento Click", mentre se premete qualsiasi altro tasto diverso dalla barra, vedrete il messaggio "Evento KeyUp".

Pubblicato il 5 giugno 2011 su Novità. Aggiungi ai preferiti il collegamento . Lascia un commento.

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

%d blogger cliccano Mi Piace per questo: