Ereditarietà e Casting

mercoledì 22 ottobre 2008 - 11.39

nullatore Profilo | Junior Member

Salve gente,
avrei bisogno di una mano sull'ereditarietà

Vi riporto il mio problema tramite un esempio:

public class Dizionario
{
public int ID;
public string Nome;
}

public class DizionarioData
{
public Dizionario SelectById(int id)
{
Dizionario temp = new Dizionario();
//per semplicità assegno dei valori ma qui effettuo una lettura da DB
temp.ID = 5;
temp.Nome = "Castello";
return temp;
}
}

public class Prodotto : Dizionario
{
}

public class ProdottoData : DizionarioData
{
}

public class Convenzione : Dizionario
{
}

public class ConvenzioneData : DizionarioData
{
}

public class Societa
{
public int id_prodotto;
public int id_convenzione;

public Prodotto ObjProdotto
{
get
{
ProdottoData pd = new ProdottoData();
return (Prodotto)pd.SelectById(id_prodotto);
}
}

public Convenzione ObjConvenzione
{
get
{
ConvenzioneData cd = new ConvenzioneData();
return (Convenzione)cd.SelectById(id_convenzione);
}
}
}


public main()
{
Societa soc = new Societa();
soc.id_convenzione = 5;
soc.id_prodotto = 6;


Response.Write(soc.ObjConvenzione.Nome);
}


La classe [Dizionario] è la classe che mappa un particolare tipologia di tabella del DB.
La classe [DizionarioData] raccoglie le funzioni base per quel tipo di tabella.

Utilizzando questo codice ottengo: Impossibile eseguire il cast di oggetti di tipo 'Dizionario' sul tipo 'Convenzione'.

Per risolvere il problema dorrei modificare le 2 proprieta della classe Societa utilizzando come tipo restituito [Dizionario] ma vorrei evitare per un motivo di chiarezza di codice.
Come posso aggirare il problema?

Grazie

~nullatore~
mai dire corto circuito virtuale

Wamba Profilo | Expert

Effettivamente quel tipo di casting non è consentito.
Io riscriverei la classe data usando i generics e passandogli il tipo.
Oppure più semplicemente la classe data si tratta di List<tipo> + metodi aggiuntivi

Ho modificato il tuo codice così e sembra funzionare:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra


-----------------------------------------------------------
Solo chi ha il Caos dentro può generare una stella danzante
Wamba
http://blogs.ugidotnet.org/WamBlog/
http://www.intellimaker.com

nullatore Profilo | Junior Member

Ho provato a fare le modifiche che mi hai suggerito ma ottengo la stessa eccezione di casting...

~nullatore~
mai dire corto circuito virtuale

Wamba Profilo | Expert

Il codice che ti ho dato funziona l'ho provato con lo snippet Complier
-----------------------------------------------------------
Solo chi ha il Caos dentro può generare una stella danzante
Wamba
http://blogs.ugidotnet.org/WamBlog/
http://www.intellimaker.com

nullatore Profilo | Junior Member

Non so che dirti.
Io ho provato a creare una webapplication con VS2005 in cui dentro App_Code ho creato un file Dizionario.cs al cui interno questo:
------------------------------------------
public class Dizionario
{
public int ID;
public string Nome;
}

public class DizionarioData<tipoBase> where tipoBase:Dizionario, new()
{
public tipoBase SelectById(int id)
{
tipoBase temp = new tipoBase();
temp.ID = 5;
temp.Nome = "Castello";
return temp;
}
}

public class Prodotto : Dizionario
{
}

public class ProdottoData : DizionarioData<Dizionario>
{
}

public class Convenzione : Dizionario
{
}

public class ConvenzioneData : DizionarioData<Dizionario>
{
}

public class Societa
{
public int id_prodotto;
public int id_convenzione;

public Prodotto ObjProdotto
{
get
{
ProdottoData pd = new ProdottoData();
return (Prodotto)pd.SelectById(id_prodotto);
}
}

public Convenzione ObjConvenzione
{
get
{
ConvenzioneData cd = new ConvenzioneData();
return (Convenzione)cd.SelectById(id_convenzione);
}
}
}
-----------------------------------------

e all'interno di Default.aspx.cx questo:

................................

protected void Page_Load(object sender, EventArgs e)
{
Societa soc = new Societa();
soc.id_convenzione = 5;
soc.id_prodotto = 6;


Response.Write(soc.ObjConvenzione.Nome);
}

-----------------------------------

tutto qui...

~nullatore~
mai dire corto circuito virtuale
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-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5