dic 232013
 

Buenas,

Hoy quería mostraros cómo acceder a médodos protegidos mediante el uso de la Class Helper (las cuales ya vimos qué eran en un mensaje anterior).

Supongamos que tenemos la siguiente clase, la cual cuenta con una propiedad protegida a la que queremos acceder:

  TMyClass = class(TObject)
  private
    FAProp: string;
    procedure SetAProp(const Value: string);
  protected
    property AProp: string read FAProp write SetAProp;
  end;

Para poder acceder a su propiedad protegida podemos actuar de la siguiente manera:

type
  THackMyClass = class(TMyClass);

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  T: TMyClass;
begin
  T := TMyClass.Create;
  //T.AProp := 'Hola';  <== error de compilación
  THackMyClass(T).AProp := 'Hola'; // <== accedemos a la propiedad
  FreeAndNil(T);
end;

No obstante, podría ser que en lugar de ser una propiedad protected, fuera strict protected. En ese caso nuestro “invento” no serviría. Aquí es donde entra nuestra amiga, la Class Helper, que nos ayudará a acceder a esa propiedad “estrictamente protegida” añadiendo funcionalidad a la clase base sin usar herencia.

Para ello, crearemos una Class Helper de TMyClass y le añadiremos una propiedad que ayudará a gestionar (leer/escribir) la propiedad estrictamente protegida.

type
  TMyClass = class(TObject)
  private
    FAProp: string;
    procedure SetAProp(const Value: string);
  strict protected
    property AProp: string read FAProp write SetAProp; // <== propiedad estrictamente protegida
  end;

  TMyClassHelper = class helper for TMyClass  // <== no hace falta que estén en la misma unidad
  private
    function GetMyPublicProp: string;
  public
    property MyPublicProp: string read GetMyPublicProp write SetMyPublicProp;
  end;

implementation

function TMyClassHelper.GetMyPublicProp: string;
begin
  Result:= Self.AProp;
end;

procedure TMyClassHelper.SetMyPublicProp(const Value: string);
begin
  Self.AProp := Value;
end;

Con ésto, sólo nos bastará acceder a nuestra nueva propiedad para poder leer/escribir en la propiedad estrictamente protegida

procedure TForm1.Button1Click(Sender: TObject);
var
  T: TMyClass;
begin
  T := TMyClass.Create;
  T.MyPublicProp := 'Hola';
  FreeAndNil(T);
end;

Pues nada, ya tenemos otro ejemplo más del uso de esta característica de la POO. Espero que os pueda ser de utilidad.

Hasta la próxima entrada.

Nos leemos

  4 Responses to “Acceder a métodos protegidos con Class Helper”

  1. hola a todos

    tengo una funcion en delphi 7 que ejecuta comandos MS-DOS y muestra salida en un Tmemo, pero al compilarlo en Delphi xe4 el resultado que muestra en el Tmemo son signos y cuadros, que puede ser?

    agradesco su ayuda

  2. hi,where can i download gmlib 1.1.0?Is it fee to use without license?Can it be combiled and installed on delphi xe5?Looking for your reply,Thanks a lot.

    yoyo,2.25.2014

Leave a Reply to cadetill Cancel reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

(required)

(required)