Pues eso, aunque se supone que Delphi no soporta sobrecargar los operadores de clase como si sucede con los tipos
records o
registros, existe cierta sintaxis que lo hace posible, apartentemente no documentada ni oficial
En fin, no se como lo habra descubierto el que lo hizo, o de donde lo saco. La cuestion es que ha publicado dos fragmentos de codigo en GitHub,
aca y
aca
Sorprendentemente este codigo compila, funciona y no hay fugas de memoria, en Delphi 2010 y Delphi 10.1 Berlin, asi que supongo que "la compatibilidad se mantiene" en todas las versiones del medio.
Código Delphi
[-]
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils,
Classes;
type
TStringListHelper = class helper for TStringList
public
class function &&op_In(const Value: string; Target: TStringList): Boolean; static;
class function &&op_LogicalOr(A, B: TStringList): TStringList; static;
end;
class function TStringListHelper.&&op_In(const Value: string; Target: TStringList): Boolean;
begin
Result := Target.IndexOf(Value) <> -1;
end;
class function TStringListHelper.&&op_LogicalOr(A, B: TStringList): TStringList;
begin
if A <> nil then
Result := A
else
Result := B;
end;
procedure Test;
var
StringListA, StringListB, StringListC: TStringList;
begin
StringListA := nil;
StringListB := TStringList.Create;
try
StringListB.Add('Hola mundo');
StringListC := StringListA or StringListB; Writeln('StringListB.Text: ' + StringListB.Text); Writeln('StringListC.Text: ' + StringListC.Text); Writeln(BoolToStr(StringListB = StringListC, True)); Writeln(BoolToStr('Hola mundo' in StringListB, True)); Writeln(BoolToStr('blabla' in StringListB, True)); finally
StringListB.Free;
end;
end;
begin
ReportMemoryLeaksOnShutdown := True;
try
Test;
Readln;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
Me parece algo realmente poderoso y peligroso al mismo tiempo, no he podido ordenar mis ideas por el momento
Realmente algo como esto si que es util para escribir codigo mas elegante y sencillo. Muchas veces se emplea el uso de
records como envolturas de clases o tipos primitivos ya que ellos son los unicos con los que se pueden sobrecargar los operadores; pero esto lo lleva a otro nivel
De hecho es posible hasta con genericos como se puede ver en el codigo del autor