Aquí va un ejemplo sacado de la vida real
Supón que quieres añadir métodos a una clase, digamos
TStringList, pero no quieres derivar una clase hija para añadirlos, por ejemplo porque otras funciones o procedimientos esperan (o devuelven) esa clase o porque quieres aplicarlos a una propiedad de ese tipo (e.g.
TMemo.Lines). La solución es usar un
class helper.
Supón que quieres que el nuevo método te de el último índice de las líneas; vamos a llamarlo
LastIndex y la implementación, simplísima, es que devuelva
Count-1. Ya puestos, vamos a añadir también un método que nos dé la última cadena.
Todo junto sería:
unit StrListHlp;
type
{ TStrListHelper }
TStrListHelper = class helper for TStringList
function LastIndex: Integer;
function LastLine: String;
end;
implementation
{ TStrListHelper }
{ Date cuenta que accedemos a propiedades de StringList:
Count, Strings, etc.
como si estuviéramos dentro de la definición de la clase }
function TStrListHelper.LastIndex: Integer;
begin
Result := Count - 1;
end;
function TStrListHelper.LastLine: String;
begin
if LastIndex >= 0 then
Result := Strings[LastIndex]
else
Result := ''; {Aunque quizá deberíamos alzar una excepción...}
end;
end.
Y ya está; a partir de ahí puedes usar esos dos métodos como si hubieran estado en la clase desde el principio con sólo añadir la unidad a la cláusula uses. Como ejemplo, el típico bucle para recorrer las líneas de un memo quedaría como:
for i := 0 to MiMemo.Lines.LastIndex do
{... lo que quieras ...};
¿Qué? ¿Fácil o no?