Cómo acceder a métodos protegidos (protected) de una clase
Artículo por Club Developers · 31 diciembre 2005
3765 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