voici un exemple concret de surcharge d'operateur dans un enregistrement (Delphi 2009)
cette surcharge permet :
convertir TDateTime vers TSplitedTime et inversement :
SplitedTime := Now;
DateTime := SplitedTime;
faire des comparaisons sur le type TSplitedTime :
if SplitedTimeA = SplitedTimeB then ...
if SplitedTimeA <> SplitedTimeB then ...
on peut bien sur aller plus loin en surchargeant d'autres operateurs, cela peut s'appliquer egalement aux classes.
on beneficie donc d'enregistrements puissants ne nécessitant plus d'appel a des fonctions de manipulation externe pour les actions les plus basiques.
cette methode tant attendue permet de reduire encore l'ecart entre delphi et c++ ce qui le rend plus RAD que jamais.
type
TSplitedTime = record
{$IF RTLVersion >= 18.0}
class operator Implicit(a: TSplitedTime): TDateTime;
class operator Implicit(a: TDateTime): TSplitedTime;
class operator Equal(a, b: TSplitedTime): Boolean;
class operator NotEqual(a, b: TSplitedTime): Boolean;
class operator GreaterThan(a, b: TSplitedTime) : boolean;
class operator LessThan(a, b: TSplitedTime): Boolean;
class operator GreaterThanOrEqual(a, b: TSplitedTime) : boolean;
class operator LessThanOrEqual(a, b: TSplitedTime): Boolean;
{$IFEND}
case integer of
0: (Hours, Minutes, Seconds, MilliSeconds : word);
1: (HMSZ : UInt64);
end;
{$IF RTLVersion >= 18.0}
class operator TSplitedTime.Implicit(a: TSplitedTime): TDateTime;
begin
result := EncodeTime(A.Hours, A.Minutes, A.Seconds, A.MilliSeconds);
end;
class operator TSplitedTime.Implicit(a: TDateTime): TSplitedTime;
begin
DecodeTime(a, result.Hours, result.Minutes, result.Seconds, result.MilliSeconds);
end;
class operator TSplitedTime.Equal(a, b: TSplitedTime): Boolean;
begin
result := a.HMSZ = b.HMSZ;
end;
class operator TSplitedTime.NotEqual(a, b: TSplitedTime): Boolean;
begin
result := a.HMSZ <> b.HMSZ;
end;
class operator TSplitedTime.GreaterThan(a, b: TSplitedTime) : Boolean;
begin
result := a.HMSZ > b.HMSZ;
end;
class operator TSplitedTime.LessThan(a, b: TSplitedTime): boolean;
begin
result := a.HMSZ < b.HMSZ;
end;
class operator TSplitedTime.GreaterThanOrEqual(a, b: TSplitedTime) : Boolean;
begin
result := A.HMSZ >= B.HMSZ;
end;
class operator TSplitedTime.LessThanOrEqual(a, b: TSplitedTime): boolean;
begin
result := A.HMSZ <= B.HMSZ;
end;
{$IFEND}