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