Cómo acceder a métodos protegidos (protected) de una clase
Artículo por Club Developers · 31 diciembre 2005
4378 vistas
Supongamos que queremos, por la razón que sea, usar un método protegido de un objeto en particular (al que llamaremos MiSuma y puede ser un componente visual o no).
Supongamos que nuestro objeto está definido asà dentro de una unidad aparte:
Nosotros lo usarÃamos asà de forma normal:
Quizás preferirÃamos usar la función Suma del objeto MiSuma directamente, pero estando éste protegido (es decir, declarado en el bloque protected de la clase TSuma), no tenemos acceso a dicho método según las leyes de la Programación Orientada a Objetos.
La solución
La idea es la siguiente
Asà quedarÃa la unidad:
Dentro de estas FAQs encontraremos varios ejemplos de uso
Supongamos que nuestro objeto está definido asà dentro de una unidad aparte:
delphi
unit UnitSuma; interface type TSuma = class private FA,FB: Integer; FResultado: Integer; procedure SetA(const Value: Integer); procedure SetB(const Value: Integer); protected // función que queremos usar function Suma(A, B: Integer):Integer; public constructor Create; destructor Destroy; property A: Integer read FA write SetA; property B: Integer read FB write SetB; property Resultado: Integer read FResultat; end; ... implementation ... function TSuma.Suma(A, B: Integer): Integer; begin Result := A + B; end; ... end.
Nosotros lo usarÃamos asà de forma normal:
delphi
var MiSuma: TSuma; ... MiSuma.A := 5; MiSuma.B := 9; Result := MiSuma.Resultado;
Quizás preferirÃamos usar la función Suma del objeto MiSuma directamente, pero estando éste protegido (es decir, declarado en el bloque protected de la clase TSuma), no tenemos acceso a dicho método según las leyes de la Programación Orientada a Objetos.
La solución
La idea es la siguiente
- Crear una clase descendiente de TSuma a la que llamaremos por ejemplo TPublicSuma
- Castear el objeto MiSuma a la nueva clase para acceder al método ahora visible
Asà quedarÃa la unidad:
delphi
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, unitSuma; type // Nuestra clase derivada... // A trabés de su definición, todos los métodos protegidos se convierten en // visibles para todo el código escrito en la unidad THackSuma = class(TSuma); TForm1 = class(TForm) private public procedure Calcula; end; ... implementation ... procedure TForm1.Calcula; var MiSuma: TSuma; begin ... // Casteamos MiSuma para usar el método ahora visible Result := THackSuma(MiSuma).Suma(A, B); .... end;
Dentro de estas FAQs encontraremos varios ejemplos de uso


