Richtig- In Sachen Vererbung ist das ja im Endeffekt auch nichts anderes: Du rufst evtl. ein
THund.Create()
auf und weist das einer
TTier
-Variable zu. Alles klar soweit in Sachen Interfaces? Das Sortieren mit IComparer<T> und allem ist da schon viel knackiger, finde ich.
Die Doku ist inhaltlich oft falsch, der Kram hinter der F1-Taste nicht zu gebrauchen. Der
tatsächliche Inhalt zu System.Generics.Defaults.TComparer.Compare ist aber hier ausnahmsweise sehr brauchbar, finde ich.
Hier mal ein Beispiel mit Integern:
Delphi-Quellcode:
program Project19;
{$APPTYPE CONSOLE}
{$R *.res}
uses System.SysUtils, System.Generics.Collections, System.Generics.Defaults;
type
/// <summary>
/// Vergleicht <c>Integer</c>, jedoch in <b>absteigender</b> Reihenfolge:
/// Für diesen Comparer ist <c>5 > 42</c>
/// </summary>
TMyReversedIntegerComparer =
class(TComparer<Integer>)
function Compare(
const Left, Right: Integer): Integer;
override;
end;
procedure justSortingThings();
var
myList: TList<Integer>;
descendingComparer: IComparer<Integer>;
item: Integer;
begin
myList := TList<Integer>.Create();
myList.AddRange([5, 42, 5, 99, -37]);
WriteLn('
Normales Sortierverhalten: ');
myList.Sort();
for item
in myList
do WriteLn(item);
WriteLn(sLineBreak);
WriteLn('
Mein eigenes Sortierverhalten: ');
descendingComparer := TMyReversedIntegerComparer.Create();
myList.Sort(descendingComparer);
for item
in myList
do WriteLn(item);
myList.Destroy();
end;
{ TMyReversedIntegerComparer }
function TMyReversedIntegerComparer.Compare(
const Left, Right: Integer): Integer;
begin
Result := -(Left - Right);
end;
begin
try
ReportMemoryLeaksOnShutdown := True;
justSortingThings();
except
on E:
Exception do
Writeln(E.ClassName, '
: ', E.
Message);
end;
readln;
end.
Ich persönlich würde es auch mit einer anonymen Methode machen aber im Endeffekt ist es das gleiche.