Ver Mensaje Individual
  #1  
Antiguo 06-10-2015
doctorhd doctorhd is offline
Miembro
NULL
 
Registrado: abr 2013
Posts: 48
Reputación: 0
doctorhd Va por buen camino
Tipos Genericos

Hola a todos tengo en siguiente problema: Cree una clase que acepta un parámetro de tipo genérico <T>, la idea de este parámetro es que acepte clases que descienden de una clase en común, lo cual también podría definirse de este tipo <t:class>, para acotar su definición. El problema que tengo es como acceder a los campos que tiene el parámetro <T>, ya que este representa la clase que es pasada. Para que quede mas claro detallo el código:
Código Delphi [-]
{Clase base que puede ser pasada como parámetro genérico a TField}
type
    TDomain = class
    private
      FName:String;
      FTipoSQL:TFieldType;
      FLenFieldIn:Integer;
      FLenFieldOut:Integer;
    protected
      constructor Create(const AName:String; ATipoSQL:TFieldType; ALenFieldIn:Integer; ALenFieldOut:Integer);
    public
      destructor Destroy; override;
    public
      property Name:String read FName;
      property TipoSQL:TFieldType read FTipoSQL;
      property LenFieldIn:Integer read FLenFieldIn;
      property LenFieldOut:Integer read FLenFieldOut;
    end;

{Clase que recibe el parámetro de tipo genérico}
type
    TField(T:class,constructor)= class
    private
      FNameField:String;
      FNameIn:String;
      FNameOut:String;
      FDomain:T;
    private
      function getNamesIn(const Index:Integer):String;
      function getNamesOut(const Index:Integer):String;
      function SepararCadena(const Cadena: string; const Delim: Char): TStringList;
      procedure setDomain(ADomain:T);
    protected
      constructor Create(const ANameField:String; ANameIn:String; ANameOut:String; ADomain:T);
    public
      destructor Destroy; override;
    public
      property NameField: String read FNameField;
      property NameIn: String read FNameIn;
      property NameOut: String read FNameOut;
      property NamesIn[const Index: Integer]:String read getNamesIn;
      property NamesOut[const Index: Integer]:String read getNamesOut;
      property Domain:T read FDomain;
    end;


{Procedimiento en donde necesito acceder a los campos de la clase que es pasada como parámetro}
procedure TField(T.setDomain)(ADomain:T);
begin
  {Creamos el objeto Domain o sus descendientes}
  FDomain:=T(GetTypeData(PTypeInfo(TypeInfo(T)))^.ClassType.Create);

  {Aqui el problema, el compilador no reconoce los campos}
  FDomain.FTipoSQL:=ADomain.TipoSQL;
  FDomain.FLenFieldIn:=ADomain.LenFieldIn;
  FDomain.FLenFieldOut:=ADomain.LenFieldOut;
end;{procedure}
Como ven la clase recibe un parámetro <T> que es asignado a FDomain. Esta asignación necesito hacerla campo a campo (clonar el objeto). Me imagino que el compilador al no saber que tipo de parámetro sera pasado no admite especificar sus campos en forma literal, pero debe existir alguna forma de invocarlos....

nota:Cambie <> por (), ya que las etiquetas de código Delphi no lo muestran.

Saludos...
Responder Con Cita