Einzelnen Beitrag anzeigen

Benutzerbild von yankee
yankee

Registriert seit: 10. Mär 2004
1.134 Beiträge
 
Lazarus
 
#1

interfaces: Ein paar grundlegende Fragen (zB. woher die AV?)

  Alt 1. Mär 2007, 17:21
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!
  Mit Zitat antworten Zitat