Ver Mensaje Individual
  #2  
Antiguo 02-11-2005
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.319
Reputación: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por DANY
...La idea es aprovechar al maximo el polimorfismo de las clases en la herencia visual, para ello hago lo siguiente...
Me da la impresión de que el polimorfismo es otra cosa, pero bueno, creo que te he entendido.

Cita:
Empezado por DANY
... Hasta ahi todo magnifico, pero que hago cuando por ej tengo que recorrer una grilla e ir insertando registros...

Código Delphi [-]
      THijo (Registro).GetDatos (...)
     //este es el problema como hago referencia a la clase hija correcta?
   ...

El problema es que recien hay es donde se los valores que le tengo que pasar a la funcion GetDatos dado que depende de lo cargado por el usuario en la grilla. Como solucion estoy desaprovechando la potencia del polimorfismo y estoy replicado codigo cada vez que me encuentro con una grilla.
Yo lo resuelvo utilizando un apuntador a la clase y métodos de clase; Ese apuntador debes pasarlo al formulario de Grid genérico, de esa forma puedes acceder al método de cada clase sin definirla en ese punto. Creo que mejor con un ejemplo:

Código Delphi [-]
   
   TBase = class(TObject)
     public
       class function GetDatos():String; virtual; abstract;
     end;
   
     THijo1 = class(TBase)
     public
       class function GetDatos():String; override;
     end;
   
     THijo2 = class(TBase)
     public
       class function GetDatos():String; override;
     end;
   
     TBaseClass = class of TBase;
   
   ... (implementación)
   
   { THijo1 }
   Class function THijo1.GetDatos: String;
   begin
     (NOTA1)
     Result := 'Hijo1';  // tu función GetDatos
   end;
   
   { THijo2 }
   Class function THijo2.GetDatos: String;
   begin
     (NOTA2)
     Result := 'Hijo2';
   end;

Cuando llames al formulario de Grid, como tú bien dices no puedes hacer referencia a las clases THijo1, THijo2,...
Lo que debes hacer es pasar la referencia a la Clase:

Código Delphi [-]
     // (LLAMADA1)
     Form2.AClass := THijo1;
     Form2.Show;
   ...
     // (LLAMADA2)
     Form2.AClass := THijo2;
     Form2.Show;
   
   y el el formulario habrás definido la propiedad como:
   
     public
       property AClass:TBaseClass read FAClass write FAClass;

De ésta forma en ese formulario puedes ejecutar la siguiente línea:

Código Delphi [-]
  
  El equivalente a la línea
  //      THijo (Registro).GetDatos (...)
  será ésta:
      Str := AClass.GetDatos;
   
     // en el caso de la LLAMADA1 obtendrás el string: Hijo1  por (NOTA1)
     // en el caso de la LLAMADA2 obtendrás el string: Hijo2  por (NOTA2)
   

Espero haberme explicado bien.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.

Última edición por Neftali [Germán.Estévez] fecha: 30-05-2007 a las 14:17:44.
Responder Con Cita