Ver Mensaje Individual
  #1  
Antiguo 21-09-2005
adlfv adlfv is offline
Miembro
 
Registrado: may 2005
Posts: 39
Reputación: 0
adlfv Va por buen camino
Unhappy Se puede hacer esto en POO?

Hola a todos.

Tengo un problema de POO y no sé si es posible hacer lo que quiero hacer, pero me imagino que sí, el problema es que no sé cómo... A ver si alguien me puede echar una mano.

Tengo una clase TBaseHabitacion, de la cual heredan otras clases qeu representan habitaciones en un estado concreto; por ahora la jerarquía es más o menos así...

TBaseHabitacion
- THabOcupada (abstracta)
- THabOcupadaCliente (abstracta)
- THabRenovada
- THabWarning
- THabVencida
- THabOcupadaPersonal (abstracta)
- THabLimpieza
- THabMantenimiento
- THabNoOcupada (abstracta)
- THabReserva
- THabDisponible

La idea es en el objeto Habitaciones (que es la lista de las habitaciones) poder hacer algo como esto (similar a AsInteger, AsBoolean de TField):

Código Delphi [-]
if Habitaciones['01'].IsOcupadaCliente then
   ShowMessage('El nombre del cliente es: ' + Habitaciones['01'].AsOcupadaCliente.Nombre);
A la hora de implementar el método "AsOcupadaCliente: THabOcupadaCliente", me dí cuenta que no se podía incluir en TBaseHabitación porque el compilador aún no sabe nada de esa clase THabOcupadaCliente debido a que se implementa después, y hereda de TBaseHabitacion... Existe alguna forma de implementar estos métodos en TBaseHabitación? Esto lo resolví haciendo como un "wrapper" de TBaseHabitacion al final del todo...

Hasta aquí todo claro... Ahora viene "el dilema"

Después me di cuenta que al analizar cada habitación para saber su estado, tendría que estar destruyendo y volviendo a crear y buscar los tipos de habitaciones cada vez (lo cual es muy ineficiente) pues la idea es crear la habitación una sola vez, al igual que obtener el tipo de la habitación (pues se supone que no cambiarán)... Entonces pensé en separar lo que es la información "basica" de una habitación (Id, estado...) de la información "especifica" de esa habitación, incluyendola como una clase, de forma que al analizar cada habitación sólo tenga que crear/destruir la información específica de la habitación.

Pero esto no parece muy compatible con el planteamiento inicial de la jerarquía de las habitaciones, porque la información específica la incluyo como una propiedad de TBaseHabitación, pero no puedo "redefinir" dicha propiedad especializando su tipo en clases descendientes, es decir, Info en TBaseHabitación es de tipo TBaseInfo, pero Info en THabOcupadaCliente debería ser de tipo TInfoOcupadaCliente...

Al ver esto... lo primero que se me vino a la cabeza fue... Estoy "reduciendo el problema al mismo problema "... Y dije... bueno, hago lo mismo para la info... es decir...

Código Delphi [-]
if Habitaciones['01'].IsOcupadaCliente then
   ShowMessage('El nombre del cliente es: ' + Habitaciones['01'].Info.AsOcupadaCliente.Nombre);
Pero al ver la jerarquía de la información en función del estado, me pasa lo mismo, tendría que hacer otro wrapper.

Código Delphi [-]
 Hab.Info := TInfoOcupadaCliente.Create;
 ShowMessage('Hab=' + IntToStr(H));
 with Hab.Info.AsOcupadaCliente do
 begin
   IdAlquiler     := FieldByName('IdAlquiler').AsInteger;
   IdCliente      := FieldByName('IdCliente').AsString;
   IdVehiculo     := FieldByName('IdVehiculo').AsInteger;
   IdPaquete      := FieldByName('IdPaquete').AsString;
   Entrada        := FieldByName('Entrada').AsDateTime;
   SalidaEstimada := FieldByName('ProximaMax').AsDateTime;
 {...}
El problema es que, no veo forma de que el siguiente código funcione correctamente, porque si Info es de tipo TBaseInfo, me da error al intentar acceder a AsOcupadaCliente, pues está implementado en el wrapper, pero si es de tipo TWrapperInfo, entonces me da error al hacer el create...

Entonces qué hago?

Qué estoy haciendo mal?

Se puede simplificar toda esa estructura y esa jerarquía?

Le agradezco enormemente a cualquiera que se haya tomado la molestia de leer el mensaje, porque para entender este toston, no es muy facil que digamos.

Muchas gracias a todos, agradezco sus comentarios.

Un cordial saludo

PD: Incluyo los interfaces de las clases citadas, por si alguien tiene dudas o quiere ver el código.
Archivos Adjuntos
Tipo de Archivo: zip Problema.zip (3,0 KB, 33 visitas)

Última edición por dec fecha: 22-09-2005 a las 07:05:33. Razón: ¡¡Encerrad el código fuente entre las etiquetas [DELPHI] ... [/DELPHI]!!
Responder Con Cita