Cómo acceder a métodos protegidos (protected) de una clase

3764 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:



delphi
  1. unit UnitSuma;
  2.  
  3. interface
  4.  
  5. type
  6.   TSuma = class
  7.   private
  8.     FA,FB: Integer;
  9.     FResultado: Integer;
  10.     procedure SetA(const Value: Integer);
  11.     procedure SetB(const Value: Integer);
  12.   protected
  13.     // función que queremos usar
  14.     function Suma(A, B: Integer):Integer;
  15.   public
  16.     constructor Create;
  17.     destructor Destroy;
  18.     property A: Integer read FA write SetA;
  19.     property B: Integer read FB write SetB;
  20.     property Resultado: Integer read FResultat;
  21.   end;
  22. ...
  23. implementation
  24. ...
  25. function TSuma.Suma(A, B: Integer): Integer;
  26. begin
  27.   Result := A + B;
  28. end;
  29.  
  30. ...
  31. end.



Nosotros lo usarÃamos asà de forma normal:



delphi
  1.   var MiSuma: TSuma;
  2.   ...
  3.   MiSuma.A := 5;
  4.   MiSuma.B := 9;
  5.   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
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, unitSuma;
  7.  
  8. type
  9.   // Nuestra clase derivada...
  10.   // A trabés de su definición, todos los métodos protegidos se convierten en
  11.   // visibles para todo el código escrito en la unidad
  12.   THackSuma = class(TSuma);
  13.  
  14.   TForm1 = class(TForm)
  15.   private
  16.   public
  17.     procedure Calcula;
  18.   end;
  19. ...
  20. implementation
  21. ...
  22. procedure TForm1.Calcula;
  23. var
  24.   MiSuma: TSuma;
  25. begin
  26. ...
  27.   // Casteamos MiSuma para usar el método ahora visible
  28.   Result := THackSuma(MiSuma).Suma(A, B);
  29. ....
  30. end;



Dentro de estas FAQs encontraremos varios ejemplos de uso