Herencia, casteo....
-
lunes, 15 de noviembre de 2010 13:18
Buenas tengo una duda a raiz de un problema que estoyt teniendo, la situacion es la siguiente:
Tengo una clase "Log" (de logeos) y tengo 3 mas que heredan de la misma..."LogVehiculos", "LogContainers", "LogVisitas".
El tema es que en el "RunWorkerCompleted" de mi backgroundWorker hago
unObjeto.Lista_todos_los_logeos = (List<log>) e.result;
cuando el eh resulta es de alguna de las 3 clases que heredan de Log pincha...
Entiendo que pincha porque no toma la herencia entre List<log> y List<LogVehiculos> sino que ve a estas dos lista como objetos distintos completamente.
Pero por mas que sepa que ese es el problema no logro desarrollar la solucion...
La solucion para mi sería: Convertir el dato Log de dentro de la lista a LogVehiculo....o al necesario...Pero no puedo lograr hacerlo!!
Escucho sugerencias ya que estoy medio perdido!!
Muchas gracias!!
Respuestas
-
jueves, 18 de noviembre de 2010 13:55Moderador
Jejejee... Molaría esta camiseta, eh??? :)
No jodas que existe, que entonces me la pillo fijo... ^_^
Bueno, para intentar aclarar un poco el tema he escrito un post en mi blog al respecto: http://geeks.ms/blogs/etomas/archive/2010/11/18/c-b-225-sico-covarianza-en-gen-233-ricos.aspx
Un saludo!!! :)
Eduard Tomàs Blog: http://geeks.ms/blogs/etomas -- Twitter: eiximenis- Propuesto como respuesta jtorrecillaMVP, Moderator viernes, 19 de noviembre de 2010 14:17
- Marcado como respuesta Eduardo PorteschellerModerator lunes, 22 de noviembre de 2010 13:55
Todas las respuestas
-
lunes, 15 de noviembre de 2010 13:20Moderador
EDIT:
Que error te está dando concretamente?
Hombre puedes utilizar el método GetType() para comprobar el tipo concreto que estás utilizando
Para el correcto funcionamiento, y que otros usuarios se puedan beneficiar de la solucion de esta pregunta por favor marca las respuestas que te hayan ayudado como "Respuesta".
Si la respuesta te ha sido util Votala.
Mi Blog: Jtorrecilla
Enlace a Faq de Winforms en Ingles Muy bueno -
lunes, 15 de noviembre de 2010 13:57
Message = "No se puede convertir un objeto de tipo 'System.Collections.Generic.List`1[SA2010Base.Base.BL.LogVehiculo]' al tipo 'System.Collections.Generic.List`1[SA2010Base.Base.BL.Log]'."
pero sabiendo el tipo puedo hacer algo? recorda que las listas de log y logVehiculos son distintas...
pensandolo un poco mas vi algo que me parecio bastante coherente...y es que el tipo logVehiculos nunca se puede convertir a log...ya que logVehiculos al heredar de log es mas especifico...por lo tanto tendrá cosas que log no...entonces nunca podre meter un objeto logVehiculo en un objeto log....
Al fin y al cabo...tendré que hacer una lista que reciba cada tipo...no me sirve tener una lista del tipo padre... List<Log>....
-
lunes, 15 de noviembre de 2010 14:05
Pues entonces recibelo en un var o en un objeto del mismo tipo, si lo recibes con el var podrias hacer algo asi:
var _temp = new (arreglo o el tipo objeto etc)
foreach (var item in (que estas usando o del que quieres cargar)){
_temp.Add(item);
}
Espero de solucion a tu problema, salu2.
-
lunes, 15 de noviembre de 2010 14:08Moderador
Pero heredan ambas de la misma clase? si es asi la lista tendrá que ser de la clase Base.
Hombre, podrías agregar a tu clase base una función que te devuelva el tipo de la clase, y en las clases que la hereden sobreescribir el método y retornar this.GetType()
de dicha manera podrás identificar siempre el tipo concreto de la lista.
Para el correcto funcionamiento, y que otros usuarios se puedan beneficiar de la solucion de esta pregunta por favor marca las respuestas que te hayan ayudado como "Respuesta".
Si la respuesta te ha sido util Votala.
Mi Blog: Jtorrecilla
Enlace a Faq de Winforms en Ingles Muy bueno -
lunes, 15 de noviembre de 2010 15:05Moderador
hola
es muy raro esto que comentas
arme el siguente ejemplo
namespace Test
{
public partial class Form1 : Form
{
public Form4()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
List<Log> resultado = ListarLogs();
}
public List<Log> ListarLogs()
{
List<Log> lista = new List<Log>();
lista.Add(new LogContainers());
lista.Add(new LogVehiculo());
return lista;
}
}
public class Log
{
}
public class LogContainers : Log
{
}
public class LogVehiculo : Log
{
}
}y funciona de maravilla, veras que el metodo devuelve List<Log> y dentro en la lista ase agregan items de clases heredadas y las devuelve sin siquiere castear
por ahi ese e.result; no esta retornando lo que parece
prueba de armar un ejmeplo como el que hice para saccarte las dudas, la tecnica que aplcias esta corecta pero puede que los datos que se cargan en e.result; no lo esten
saludos
Leandro Tuttini
Blog
Buenos Aires
Argentina- Marcado como respuesta Eduardo PorteschellerModerator viernes, 19 de noviembre de 2010 13:39
- Desmarcado como respuesta jtorrecillaMVP, Moderator viernes, 19 de noviembre de 2010 14:17
-
martes, 16 de noviembre de 2010 15:50
Ok ahora lo voy a probar, gracias a todos por sus respuestas!! Ayer tuve un problemita y no pude seguir con este tema, recien ahora voy a retomar, disculpen la tardanza en responder...los mantendré al tanto de lo que pase hoy, y desde ya muchas gracias!!
Martin.
-
miércoles, 17 de noviembre de 2010 13:51Moderador
Buenas!
Tu problema es que intentas convertir una List<LogVehiculos> a una List<Log> y...
... los genéricos no son covariantes en el framework 3.5
- LogVehiculos deriva de Log
- List<LogVehiculos> no deriva de List<Log>
En el framework 4 eso se complica un poco... Así los genéricos pueden ser covariantes (o contravariantes) pero depende de cada clase. En tu caso concreto aunque usaras VS2010 no estarías de suerte ya que List<T> no es covariante respecto a T.
Si en lugar de List<T> usas IEnumerable<T> y el framework 4 entonces si que te funcionará. Ojo! En framework 4, en 3.5 o anteriores no.
Un saludo!
Enlace sobre covarianza y contravarianza en msdn: http://msdn.microsoft.com/es-es/library/ee207183.aspx
Eduard Tomàs Blog: http://geeks.ms/blogs/etomas -- Twitter: eiximenis -
miércoles, 17 de noviembre de 2010 13:59Moderador
:-)
¿Eras tú el de la camiseta: "YO ENTIENDO LO QUE SON COVARIANZA Y CONTRAVARIANZA!"?
La ví hace poco y no recuerdo dónde...
No olvides marcar la respuesta como correcta si te ha sido de utilidad :-)
[MS-MVP-MCTS]
Follow me on Facebook or Twitter!
Mi Perfil MVP en: https://mvp.support.microsoft.com/profile/Lluis
NUG: http://andorradotnet.com
Web: http://www.ordeeno.com
Geeks: http://geeks.ms/blogs/lfranco
-
jueves, 18 de noviembre de 2010 13:31ModeradorHola
¿ Has podido solucionar tu problema ?
Saludos
Eduardo Portescheller -
jueves, 18 de noviembre de 2010 13:55Moderador
Jejejee... Molaría esta camiseta, eh??? :)
No jodas que existe, que entonces me la pillo fijo... ^_^
Bueno, para intentar aclarar un poco el tema he escrito un post en mi blog al respecto: http://geeks.ms/blogs/etomas/archive/2010/11/18/c-b-225-sico-covarianza-en-gen-233-ricos.aspx
Un saludo!!! :)
Eduard Tomàs Blog: http://geeks.ms/blogs/etomas -- Twitter: eiximenis- Propuesto como respuesta jtorrecillaMVP, Moderator viernes, 19 de noviembre de 2010 14:17
- Marcado como respuesta Eduardo PorteschellerModerator lunes, 22 de noviembre de 2010 13:55
-
jueves, 18 de noviembre de 2010 14:05ModeradorExistir existe, pero no recuerdo dónde la he visto... juraría que era en un post :-S
No olvides marcar la respuesta como correcta si te ha sido de utilidad :-)
[MS-MVP-MCTS]
Follow me on Facebook or Twitter!
Mi Perfil MVP en: https://mvp.support.microsoft.com/profile/Lluis
NUG: http://andorradotnet.com
Web: http://www.ordeeno.com
Geeks: http://geeks.ms/blogs/lfranco
-
viernes, 19 de noviembre de 2010 14:20Moderador
Tal como comenta Eduard, en su post, dale un vistazo para que puedas entender como realizar lo que quieres.
Un saludo.
Para el correcto funcionamiento, y que otros usuarios se puedan beneficiar de la solucion de esta pregunta por favor marca las respuestas que te hayan ayudado como "Respuesta".
Si la respuesta te ha sido util Votala.
Mi Blog: Jtorrecilla
Enlace a Faq de Winforms en Ingles Muy bueno

