Respondida 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

Todas las respuestas

  • lunes, 15 de noviembre de 2010 13:20
    Moderador
     
     

    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:08
    Moderador
     
     

    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:05
    Moderador
     
     

    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
  • 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:51
    Moderador
     
     

    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:59
    Moderador
     
     

    :-)

    ¿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:31
    Moderador
     
     
    Hola

    ¿ Has podido solucionar tu problema ?

    Saludos

    Eduardo Portescheller
  • jueves, 18 de noviembre de 2010 13:55
    Moderador
     
     Respondida

    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
  • jueves, 18 de noviembre de 2010 14:05
    Moderador
     
     
    Existir 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:20
    Moderador
     
     

    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