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
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
Buenas
Para preguntas, por favor, dirígete a foros como Delphi Acess. No obstante, seguramente será porque a partir de D2010 la codificación usada es UNICODE.
Saludos
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
Hi yoyo
GMLib is under LGPL License and you can download the latest version from SVN repository from here.
Regards