dic 282012
 

Buenas,

Los que tengan nociones de POO (Programación Orientada a Objetos) sabrán perfectamente cómo añadir funcionalidades a una clase creando una nueva.

Por ejemplo, imaginemos que tenemos la clase TMyClass definida de la siguiente manera:

type
  TMyClass = class
    procedure MyProc;
    function MyFunc: Integer;
  end;
....
procedure TForm1.Button1Click(Sender: TObject);
var
  C1: TMyClass;
begin
  C1 := TMyClass.Create;
  C1.MyProc;
  C1.MyFunc;
  C1.Free;
end;

Si queremos añadir funcionalidad a esta clase, lo primero que se nos puede venir a la cabeza es la herencia, es decir, crear una nueva clase que contenga las nuevas funcionalidades o especializaciones, quedando como ésto:

  TMyCustomClass = class(TMyClass)
    procedure AnotherProc;
  end;
.....
procedure TForm1.Button1Click(Sender: TObject);
var
  C1: TMyCustomClass;
begin
  C1 := TMyCustomClass.Create;
  C1.MyProc;
  C1.MyFunc;
  C1.AnotherProc; // <- hacemos uso del nuevo método
  C1.Free;
end;

El «inconveniente» de hacerlo así es que, como vemos, si queremos usar el método AnotherProc tendremos que crear un objeto de tipo TMyCustomClass. Pero, ¿qué pasa si tenemos un proyecto que hace uso masivo de TMyClass? En ese caso tendríamos que cambiar todas las referencias de TMyClass por TMyCustomClass, y eso podría ser un trabajo tedioso, y más si lo que queremos es ampliar la clase, no especializarla.

Para ese menester, Delphi (de echo la POO) nos brinda con las Helper Class (también aplicable a los records). Una Helper Class es una clase que, asociada a otra clase, añade nuevos métodos o propiedades a la clase asociada y que pueden ser usados por ésta. Es una forma de expandir una clase sin necesidad de herencia.

La sintaxis de las Helper Class es la siguiente:

type
   identifierName = class|record helper [(ancestor list)] for TypeIdentifierName
     memberList
   end;

La implementación para nuestro ejemplo sería así:

type
  TMyHelperClass = class helper for TMyClass
    procedure AnotherProc;
  end;
.......
procedure TForm1.Button1Click(Sender: TObject);
var
  C1: TMyClass; // <- objeto de la clase base....
begin
  C1 := TMyCustomClass.Create;
  C1.MyProc;
  C1.MyFunc;
  C1.AnotherProc; // <- ... pero que puede usar el nuevo método
  C1.Free;
end;

Para más información podéis consultar la docwiki de Embarcadero sobre este tema en Class and Record Helpers (Delphi).

Nos leemos