es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Creando una clase secundaria basada en el contenido de la clase.

Tengo una estructura de clases como esta:

                        LineTemplate (abstracto)
                        /                    \
                LineOut (abstracto)        LineIn (final)
                /                \
LineOutTransfers (final)     LineOutSells (final)

Tanto LineOut como LineIn deben leer una línea de un archivo, verificar su contenido en una base de datos y ejecutar múltiples consultas.

Sin embargo, LineOut contiene dos variaciones ligeramente diferentes, que dependen del contenido de la línea. Debido a que LineOutTransfers y LineOutSells realizan acciones distintas cuando se llaman a sus métodos, decidí heredarlos y tratarlos como subclases.

Creé un método public static LineTemplate __init() dentro de LineTemplate para determinar si es una clase LineOut o LineIn y devolver el tipo correcto basado en condiciones externas, y quería implementar un método similar para determinar el tipo correcto de subclase de LineOut.

Sin embargo, dado que el hijo de LineOut depende del contenido de la línea, estoy atascado en este punto. La clase debería leer la línea, luego convertirse en el hijo correcto y luego realizar las verificaciones. Pero esto es imposible ya que no puedo convertir una clase padre en una clase hija si no es del mismo tipo (polimorfismo).

También pensé en leer toda la línea dentro del método __init() de LineOut y luego pasar las variables como argumentos al constructor de su hijo, pero como hay un montón de variables que se deben leer y como se hace de manera diferente dentro de LineIn, me pareció una mala práctica.

¿Alguna idea? Gracias de antemano.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Una solución a este problema es utilizar un patrón de fábrica para crear el tipo adecuado de hijo LineOut basado en el contenido de la línea. El método de fábrica estaría definido en la clase padre LineOut y tomaría la línea como parámetro. Analizaría el contenido de la línea y devolvería la clase hija correspondiente (LineOutTransfers o LineOutSells) con el contenido de la línea ya establecido como parámetro para el constructor del hijo. De esta manera, la clase padre LineOut no necesita conocer los detalles del contenido de la línea ni qué clase hija crear. El método de fábrica también se puede ampliar fácilmente en el futuro para acomodar nuevas clases hijas sin modificar la clase padre.

Comments are closed.