User Tag List

Resultados 1 al 8 de 8

Tema: Duda sobre herencia

  1. #1

    Fecha de ingreso
    Sep 2005
    Mensajes
    15,234
    Mencionado
    248 Post(s)
    Tagged
    1 Tema(s)
    Agradecer Thanks Given 
    679
    Agradecer Thanks Received 
    1,863
    Thanked in
    Agradecido 1,276 veces en [ARG:2 UNDEFINED] posts

    Duda sobre herencia

    Buenas a todos:

    Creía tener muy claro el tema de herencia y demás, pero parece que aún hay cosas que se me resisten.
    Bueno, resulta que tengo dos clases para guardar datos, una derivada de la otra:
    Código:
    public class lote
    {
       int id {get; set;}
    }
    
    public class loteExt : lote
    {
       string  {get; set;}
    }
    Y resulta que tengo otras dos clases, que también derivan una de la otra:
    Código:
    public class artic
    {
       int id {get; set;}
       private List<lote> _lista;
    
       public List<lote> lista
       {
          get { return _lista; }
          set { _lista = value; }
    }
    
    public class articExt : artic
    {
       private new List<loteExt> _lista;
    
       public new List<loteExt> lista
       {
          get { return _lista; }
          set { _lista = value; }
    }
    Como podéis ver, lo que intento hacer es que la clase articExt contenga un objeto llamado "lista", pero que oculte la de su clase base, que encima, es de un tipo diferente. A pesar de ponerle new, que según la documentación, oculta el elemento base, me ha pasado que cuando he ido a consultar "lista" de mi elemento articExt, me ha saltado un nullPointerException. Usando el debugger, he podido ver que la clase articExt tiene DOS elementos lista, uno a null y otro con los datos, siendo este último el de la clase base.
    No entiendo cómo es posible que haya dos elementos con el mismo nombre (aunque sean de distinto tipo), ni cómo han ido a parar los lotes a la lista base (bueno, viene desde la WebApi, así que algún error de deserialización), y no sé cómo solucionarlo.

    No me deja poner "lista" de "artic" como "virtual" porque no son del mismo tipo. Mi otra idea era eliminar "lista" y "_lista" de articExt, porque al fin y al cabo, puedo usar "lista" de la clase base "artic" gracias a la herencia de los lotes, pero no sé hasta qué punto me puede dar problemas. Para empezar, en el proyecto me ha dado como 17 errores por intentar inicializar la lista con:
    Código:
     miArtic.lista = new List<loteExt>()
    Y no sé qué otros problemas puede acarrear en un proyecto tan grande como este.

    ¿Alguna indicación? ¿Algo que haya pasado por alto?
    Gracias.
    Última edición por Drumpi; 01/06/2023 a las 19:42
    PROYECTOS REALIZADOS: FrikiMusic, Motor Scroll Tileado v3.2, Venturer2X (GP2X/WIZ), Echo, Screen Break Time
    PROYECTOS EN MARCHA (algunos): Bennu GP2X: 95% (necesito ayuda) ¡Antes de Halloween!: 92% SpaceH2H: 8%

  2. #2

    Fecha de ingreso
    Sep 2006
    Ubicación
    Malaga
    Mensajes
    7,573
    Mencionado
    47 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    1,676
    Agradecer Thanks Received 
    1,930
    Thanked in
    Agradecido 1,293 veces en [ARG:2 UNDEFINED] posts
    ¿por que tienes atributos repetidos en la clase que hereda (id, _lista)?
    No es lo mismo tener diez años de experiencia, que tener un año de experiencia diez veces.


    It is an undisputed truth that the Atari ST gets the best out of coders. No dedicated hardware, just the CPU and a frame buffer! Some call it Spartan, others name it Power Without The Price, and a select few say `challenge accepted'! --- by spkr from smfx

  3. #3

    Fecha de ingreso
    Sep 2005
    Mensajes
    15,234
    Mencionado
    248 Post(s)
    Tagged
    1 Tema(s)
    Agradecer Thanks Given 
    679
    Agradecer Thanks Received 
    1,863
    Thanked in
    Agradecido 1,276 veces en [ARG:2 UNDEFINED] posts
    Perdón, el repetir "int id" en "loteExt" ha sido una errata.
    Pero "lista" no está repetido: son listas de tipos diferentes.

    Otro error que he cometido ha sido decir que los datos se han guardado en la "lista" de la clase base. No, se han guardado en la clase derivada, lo cual es correcto.
    Pero esto es lo que me ha provocado el problema: hay una parte en la que hago:
    Código:
    public static void copiar (artic viejo)
    {
       artic nuevo = new artic ()
       {
          id = viejo.id,
          lista = new List<lote>()
       }
    
       lote tempLote = new lote()
       {
           id = viejo.list[0].id
       }
    
       nuevo.lista.Add(lote);
    En la parte en la que hago
    Código:
    id = viejo.list[0].id
    Me salta una excepción si viejo es de tipo "articExt", y es por lo que digo: lista tiene datos, pero base.lista está a null.
    Con el tipo "artic" esto no pasa porque sólo hay una lista.

    ...Y es que soy tonto. Naturalmente "viejo" va a buscar en base.lista, porque he dicho que es de tipo "artic".
    Si hago un "cast" previamente, ya me coge los datos bien.
    Código:
    public static void copiar (artic viejo)
    {
       artic nuevo = new artic ()
       {
          id = viejo.id,
          lista = new List<lote>()
       }
    
       lote tempLote = new lote();
       //******************************
       if (viejo is articExt ae)
           tempLote.id = ae.list[0].id
       else
           tempLote.id = viejo.list[0].id
       }
       //******************************
    
       nuevo.lista.Add(lote);
    Pero sigo sin entender por qué new mantiene ambas variables lista, cuando debería ocultar base.lista :S
    PROYECTOS REALIZADOS: FrikiMusic, Motor Scroll Tileado v3.2, Venturer2X (GP2X/WIZ), Echo, Screen Break Time
    PROYECTOS EN MARCHA (algunos): Bennu GP2X: 95% (necesito ayuda) ¡Antes de Halloween!: 92% SpaceH2H: 8%

  4. #4

    Fecha de ingreso
    Sep 2006
    Ubicación
    Malaga
    Mensajes
    7,573
    Mencionado
    47 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    1,676
    Agradecer Thanks Received 
    1,930
    Thanked in
    Agradecido 1,293 veces en [ARG:2 UNDEFINED] posts
    Si son tipos distintos deberían llamarse distinto, no se que ganas poniendoles el mismo nombre, mas bien es un lio porque no sabras a que lista te estas refiriendo.

    ¿por que haces public new List<loteExt> lista en articExt y en artic solo haces public List<loteExt> lista?

    ¿Que quieres hacer, que dependiento del tipo se meta en una lista u otra?
    No es lo mismo tener diez años de experiencia, que tener un año de experiencia diez veces.


    It is an undisputed truth that the Atari ST gets the best out of coders. No dedicated hardware, just the CPU and a frame buffer! Some call it Spartan, others name it Power Without The Price, and a select few say `challenge accepted'! --- by spkr from smfx

  5. #5

    Fecha de ingreso
    Mar 2007
    Ubicación
    Barna
    Mensajes
    10,357
    Mencionado
    93 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    374
    Agradecer Thanks Received 
    1,801
    Thanked in
    Agradecido 951 veces en [ARG:2 UNDEFINED] posts
    Yo tampoco veo la gracia de poner dos variables con el mismo nombre y diferente tipo. Son ganas de confundirse a lo tonto

    Además, piensa que gracia a la herencia puedes pasar un objecto articExt a alguien que espere artic. Si ese accede a .lista... ¿a qué tipo de lista estará accediendo?

    Yo lo veo una fuente de problemas, la verdad.

    Deja que articExt admita objectos "lote" en todos lados, pero en el set emite una excepción si en realidad no son del tipo loteExt. Vivirás más tranquilo.
    "Todo es absolutamente falso, salvo alguna cosa"

  6. #6

    Fecha de ingreso
    Sep 2005
    Mensajes
    15,234
    Mencionado
    248 Post(s)
    Tagged
    1 Tema(s)
    Agradecer Thanks Given 
    679
    Agradecer Thanks Received 
    1,863
    Thanked in
    Agradecido 1,276 veces en [ARG:2 UNDEFINED] posts
    Cita Iniciado por swapd0 Ver mensaje
    Si son tipos distintos deberían llamarse distinto, no se que ganas poniendoles el mismo nombre, mas bien es un lio porque no sabras a que lista te estas refiriendo.

    ¿por que haces public new List<loteExt> lista en articExt y en artic solo haces public List<loteExt> lista?

    ¿Que quieres hacer, que dependiento del tipo se meta en una lista u otra?
    Exacto: lo que quiero hacer es que si uso articExt, el tipo de datos en lista sea loteExt, porque en mi artículo (con información) extendida, necesito que los lotes tengan información extendida. Si le pongo otro nombre acabo con dos listas distintas de lotes en articExt y entonces sí que va a ser un lío.

    Cita Iniciado por juanvvc Ver mensaje
    Yo tampoco veo la gracia de poner dos variables con el mismo nombre y diferente tipo. Son ganas de confundirse a lo tonto

    Además, piensa que gracia a la herencia puedes pasar un objecto articExt a alguien que espere artic. Si ese accede a .lista... ¿a qué tipo de lista estará accediendo?

    Yo lo veo una fuente de problemas, la verdad.

    Deja que articExt admita objectos "lote" en todos lados, pero en el set emite una excepción si en realidad no son del tipo loteExt. Vivirás más tranquilo.
    Creo recordar que, cuando diseñé esto, me preocupaba seriamente la serialización en JSON de las variables.
    En su momento creo que no lo vi, que podía haber dejado la lista como tipo lote, y haber guardado loteExt si el elemento era articExt, pero me preocupaba eso, que si en un apartado genérico del programa tenía una lista de artic y articExt, al enviarlo a la WebApi, al convertirlo a JSON, los datos extra de articExt y loteExt no se añadieran.

    Hoy quiero comprobar si esto es así o no, si tengo tiempo, porque lo ideal es lo que digo, que articExt no tenga ninguna definición de lista, y que en lista, gracias a la herencia, pueda guardar tanto lotes como loteExts.
    PROYECTOS REALIZADOS: FrikiMusic, Motor Scroll Tileado v3.2, Venturer2X (GP2X/WIZ), Echo, Screen Break Time
    PROYECTOS EN MARCHA (algunos): Bennu GP2X: 95% (necesito ayuda) ¡Antes de Halloween!: 92% SpaceH2H: 8%

  7. #7

    Fecha de ingreso
    Nov 2005
    Ubicación
    Excartagenero
    Mensajes
    23,719
    Mencionado
    276 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    6,012
    Agradecer Thanks Received 
    5,866
    Thanked in
    Agradecido 3,823 veces en [ARG:2 UNDEFINED] posts
    Entradas de blog
    1
    Estos peoblemas causados por moderneces en programación estructurada no pasan.

  8. #8

    Fecha de ingreso
    Sep 2009
    Ubicación
    Donde quiero
    Mensajes
    6,160
    Mencionado
    175 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    1,848
    Agradecer Thanks Received 
    2,378
    Thanked in
    Agradecido 1,309 veces en [ARG:2 UNDEFINED] posts
    Cita Iniciado por josepzin Ver mensaje
    Estos peoblemas causados por moderneces en programación estructurada no pasan.
    Ya hay un hilo "con cable o sin cable" para debatir estas cosas

Etiquetas para este tema

Permisos de publicación

  • No puedes crear nuevos temas
  • No puedes responder temas
  • No puedes subir archivos adjuntos
  • No puedes editar tus mensajes
  •