Generics in depth

di Andrea Zani, in .NET2,

Stavo giocherellando ancora con i generics - si vede che non ho un c***o da fare? e i trenta chilometri quotidiani in bici me li sono già fatti - e mi è ricapitato tra le mani del codice scritto parecchio tempo fa per l'asp.net 1.*. Brevemente: in un hashtable inserivo una classe con delle proprietà tra le quali un altro hashtable contenente un'altra classe con altre proprietà. Detto così non si capisce nulla, vero? Vediamo di tradurlo in qualcosa di più palpabile come del puro e sano codice. Vediamo le due classi:

public class Persona
{
 public Persona(string nome,string cognome, int eta)
 {
  Nome=nome;Cognome=cognome;Eta=eta;
 }
 public string Nome;
 public string Cognome;
 public int Eta;
 public Hashtable Figli;
}

public class Figlio
{
 public Figlio(string nome,int eta)
 {
  Nome=nome;Eta=eta;
 }
 public string Nome;
 public int Eta;
}

Perdonate se non ho usato le property per l'accesso ai membri di questa classe, ma così è più semplice. Banalmente nella classe Persona possiamo inserire i dati identificativi di una persona e nalla proprietà Figli i dati dei familiari. Infine la collection di persone le inseriremo in un Hashtable in modo da avere una key con cui prelevare i dati. Ecco un esempio di codice che fa questo:

Hashtable persone=new Hashtable();
Hasttable nipoti=new HashTable();
nipoti["Qui"]=new Figlio("Qui",50);
nipoti["Quo"]=new Figlio("Quo",50);
nipoti["Qua"]=new Figlio("Qua",50);
persone["paperino"]=new Persona(
  "Paolino","Paperino",100,nipoti);

In questo caso ho inserito un solo elemento, "Paperino" con relativa discendenza. Quindi, se teoricamente, mi devo riprendere il nome e l'età del primo Figlio della classe Persona, dovrei fare via codice:

string Nome=((Figlio)((Persona)persone["paperino"]).Figli["Qui"]).Nome;
int eta=((Figlio)((Persona)persone["paperino"]).Figli["Qui"]).Eta;

Il VB.NET non se la cava meglio in semplicità:

dim Nome as string=DirectCast( DirectCast(persone["paperino"],Persona).Figli("Qui"),Figlio).Nome
dim Eta as string=DirectCast( DirectCast(persone["paperino"],Persona).Figli("Qui"),Figlio).Eta

Qual è il problema? La fila infinita di conversioni, e questo per solo due classi inserite una all'interno dell'altra! Se sotto la classe Figlio fosse presente la classe Nipote con la stessa struttura, avremo dovuto scrivere:

[C#]:
string Nome=((Nipote) ((Figlio) ((Persona)persone["paperino"]).Figli["Qui"]).Nipote["xx"]).Nome;
[VB]:
dim Nome as string=DirectCast(DirectCast(DirectCast(persone("Paperino"), Persona).Figli("Qui"), Figli).Nipoti("xx"), Nipote).Nome

Sfido chiunque a non fare confusione! :)

Come visto nella mia bloggata precedente, uno dei vantaggi dei generics è il cast automatico. Riscriviamo gli esempi precedenti dunque:

public class Persona
{
public Persona(string nome,string cognome, int eta)
{
 Nome=nome;Cognome=cognome;Eta=eta;
}
public string Nome;
public string Cognome;
public int Eta;
public Dictionary<string,Figlio> Figli;
}

L'unica modifica è nella classe Persona: non è più utilizzato l'oggetto Hashtable ma ho usato il Dictionary.

Dictionary<string,Persona> persone=new Dictionary<string,Persona>();
Dictionary<string,Figlio> nipoti=new Dictionary<string,Figlio>();
nipoti["Qui"]=new Figlio("Qui",50);
nipoti["Quo"]=new Figlio("Quo",50);
nipoti["Qua"]=new Figlio("Qua",50);
persone["paperino"]=new Persona(
"Paolino","Paperino",100,nipoti);

Poche modifiche finora, ma vediamo come prendere ora i valori:

string Nome=persone["Paperino"].Figli["Qui"].Nome;
int Eta=persone["Paperino"].Figli["Qui"].Eta;

C'è bisogno di confrontare?

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Nella stessa categoria
I più letti del mese