Hi @ll,
alles, was ich an Erfahrung mit Interfaces habe kommt von Java und jetzt probiere ich diese mal in Delphi anzuwenden und .... habe damit ein paar Probleme
.
Ich habe mir überlegt eine allgemeine Lösung zum sortieren einer TObjectList zu coden:
Delphi-Quellcode:
unit USortedList;
interface
uses SysUtils, Contnrs;
type
IComparable =interface
['
{210AC03E-6716-49A5-8B54-34845AE4A087}']
function Compare(other: TObject):integer;
end;
TSortedList =class(TObjectList)
public
function Add(neu: IComparable):integer;
procedure Sort;
end;
TIntTest =class(TInterfacedObject, IComparable)
public
v: integer;
function Compare(other: TObject):integer;
end;
implementation
function TIntTest.Compare(other: TObject):integer;
begin
result :=v-TIntTest(other).v;
end;
function TSortedList.Add(neu: IComparable):integer;
begin
result :=inherited Add(TObject(neu));
end;
procedure TSortedList.Sort;
procedure QuickSort(iLo, iHi: Integer);
var
Lo, Hi: Integer;
Mid: IComparable;
begin
Lo := iLo;
Hi := iHi;
Supports(Items[(Lo + Hi)
div 2],IComparable,Mid);
//Hier gibt es eine AV
repeat
while Mid.Compare(Items[Lo]) < 0
do Inc(Lo);
while Mid.Compare(Items[Hi]) > 0
do Dec(Hi);
if Lo <= Hi
then
begin
Exchange(Lo,Hi);
Inc(Lo);
Dec(Hi);
end;
until Lo > Hi;
if Hi > iLo
then QuickSort(iLo, Hi);
if Lo < iHi
then QuickSort(Lo, iHi);
end;
begin
QuickSort(0,Count-1);
end;
end.
Dazu habe ich folgende Fragen:
1. Wofür ist die id (['{210AC03E-6716-49A5-8B54-34845AE4A087}']) gut? Soweit ich das sehe ist die 100% zufällig.
2.
TIntTest =class(TInterfacedObject, IComparable)
Muss ich das Objekt unbedingt von TInterfacedObject ableiten? Da wäre dann ja schon 80% der Grundidee von interfaces futsch...?! Ich will ja, dass ich meine Klasse, die ich später in der Liste mal speichere möglicherweise von was anderem ableiten.
3.
Supports(Items[(Lo + Hi) div 2],IComparable,Mid);
Am Anfang habe ich versucht das Objekt einfach zu casten (IComparable(Items[...])) aber wie ich gelesen habe funktioniert das nur in .net uind nicht in D für
win32. Aber Supports funktioniert auch nicht so, wie ich gedacht hätte, denn der Aufruf wirft mir eine
Access Violation. Warum? Und vorallem: Wie mache ich es richtig?
Letzter Tipp: Drogen. Machen zwar nicht glücklich, geben einem aber wenigstens das Gefühl glücklich zu sein.
Have a lot of fun!