Salve a tutti!
Oggi parliamo delle classi Generics!
I linguaggi della piattaforma .Net, nello specifico C#, mettono a disposizione i Generics per eliminare tutte quelle problematiche legate al casting degli oggetti,al boxing e alla protezione dei tipi.
Le classi generiche accettano dei parametri chiamati parametri di tipo che indicano il tipo di oggetti sui quali la classe deve operare.
Il framework Dot Net mette a disposizione molte classi e interfacce che sono presenti nel namespace System.Collection.Generic, molte di queste classi vengono utilizzate abitualmente per effettuare operazioni tra le piu svariate, si prenda il caso ad esempio della classe generica List<T> :
List<string> listOfString = new List<String>();
In questo modo abbiamo creato una lista che nello specifico contiene stringhe ma all'occorrenza puo contenere Interi,
List<int> listOfInteger = new List<int>();
oggetti generici,
List<Object> listOfObject = new List<Object>();
oppure oggetti creati dallo sviluppatore,
List<MiaClasse> listOfMiaClasse = new List<MiaClasse>();
La potenza dei Generics sta proprio in questo, rendere completamente indipendenti dai tipi lavorando ad un livello di astrazione molto alto senza preoccuparsi, come dicevo poc'anzi, delle operazioni di boxing, casting e dei problemi relativi ai tipi.
Vediamo ora uno stralcio di metadati provenienti dalla classe List<T> del framework.
Come possiamo notare, la classe viene definita cosi :
Public class NomeClasse<T>
Questa dichiarazione ci permette quindi di trattare una classe come una classe generics a cui potremo passare un tipo al posto di <T> come negli esempi precedenti.
Possiamo subito notare il metodo Add(T item), che acquisisce il tipo dall'istanziazione della classe ed esegue le operazioni, per capirci :
List<int> interi = new List<int>
Il metodo Add sarà equivalente a :
Add(int item)
Ora per capire effettivamente il funzionamento del metodo posto il metodo Add per intero :
Il metodo gestirà il parametro item come se fosse un'intero, portando elegantemente alla fine il proprio compito.
Nota bene!
I più attenti avranno di certo notato la seguente istruzione :
this._items[this._size++] = item;
Ma se item è di tipo T come mai il compilatore lo aggiunge all'array _items[] senza nessun errore?
Semplice! _items è dichiarato nel seguente modo :
private T[] _items;
Analizziamo ora un possibile caso d'uso reale.
Immaginiamo di aver bisogno di una classe che, dati due oggetti ne effettui uno swap, gli oggetti potrebbero essere di qualsiasi tipo:
Creiamo una classe generics, chiamiamola Swapper e scriviamo all'interno un metodo Swap :
Come potete notare i parametri nel metodo acquisiscono il tipo delle classe (T).
Ora non ci resta che implementarla !
Ecco il risultato :
Un'utilizzo di qualsiasi altro approccio al di fuori dell'approccio Generics sarebbe stato notevolmente piu dispendioso e macchinoso.
In quest'articolo è stato presentato l'uso dei generics, ora sta a voi applicarli ai vari casi reali rendendo il vostro codice piu flessibile e dinamico che mai!
Stay Tuned!