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