Hola!
Los ClassHelpers son indudablemente una fantástica herramienta, útil, como dices, para introducir nuevos métodos a clases existentes.
Sin embargo, desde Embarcadero enfatizan que "NO DEBE SER UTILIZADO PARA DESARROLLAR NUEVO CÓDIGO". La razón de esto es que sólo puede haber un class helper activo en cada momento, por lo que si alguien usase el class helper que tú propones, y ahora crease un nuevo class helper con la función, p. ej. to_date: TDateTime, entonces no podría utilizar ambos.
Los ClassHelpers están pensados para "hackear" clases que NO tenemos disponibles, gracias a su habilidad de leer variables privadas de la clase a la que "ayudan". Por ejemplo, podríamos resolver un bug en FMX sin tener que recompilar el framework o añadir una funcionalidad a una clase proporcionada por un tercero, la cual requiera variables privadas de ésta.
Por tanto, siempre que se pueda, es recomendable usar herencia tradicional, antes que usar un class helper.
P. ej. en tu caso, podrías hacer algo como esto (escrito en el navegador, así que no sé si compilará):
Código Delphi
[-]
unit EditAdv;
implementation
uses
VCL.StdCtrls;
type
TEdit=class (VCL.StdCtrls.TEdit)
public
function toUpper: string;
function toLower: string;
function to_i: integer;
function to_f: extended;
function toEqual(value: string): boolean;
function find(value: string): boolean;
end;
Y así, en donde necesites esta funcionalidad, añades en el uses (debes añadirlo después de VCL.StdCtrls) EditAdv y ya tienes la funcionalidad preparada.
Si alguien quiere añadir más cosas, pues simplemente:
Código Delphi
[-]
unit EditAdv2;
implementation
uses
EditAdv;
type
TEdit=class (EditAdv.TEdit)
public
function toDateTime: TDateTime;
end;
y usaría EditAdv2 en lugar de EditAdv.
¿Y entonces, para qué se usa el class helper si ya no hace falta?
En todo esto, el class helper tendría su lugar si, p. ej. para implementar una de tus funciones avanzadas necesitases acceder a alguna variable interna (privada) de éste, la cual no tienes accesible en la clase heredada. Entonces sí es necesario usar el class helper, ya que el lenguaje no te ofrece ninguna otra forma de hacerlo.
Te pongo un ejemplo de esto último, en el cual se necesita acceder a la variable FOldSelLength de la clase TCustomEdit:
Código Delphi
[-]unit Unit2;
interface
uses
Vcl.StdCtrls;
type
TEdit=class (Vcl.StdCtrls.TEdit)
public
procedure MiNuevaFuncionQueNecesitaOldSelLength();
end;
implementation
type
TEditHelper=class helper for Vcl.StdCtrls.TCustomEdit
protected
function GetOldSelLength: integer;
end;
function TEditHelper.GetOldSelLength: integer;
begin
Result:=Self.FOldSelLength;
end;
procedure TEdit.MiNuevaFuncionQueNecesitaOldSelLength;
begin
ShowMessage(IntToStr(GetOldSelLength));
end;
end.
Espero no haberte confundido mucho
. Simplemente quédate con que SIEMPRE que puedas hacer algo mediante herencia, usa herencia. Cuando no veas posibilidad de usar herencia, entonces, tal vez, haya que usar class helper.
Un saludo,
LoPiTaL