Einzelnen Beitrag anzeigen

Benutzerbild von Hepdepaddel
Hepdepaddel

Registriert seit: 12. Dez 2005
Ort: Bremen
91 Beiträge
 
Delphi 2006 Enterprise
 
#1

Interface und Objektreferenz offenbar noch nicht verstanden

  Alt 18. Sep 2015, 07:34
Delphi-Version: 5
Hallo, zusammen,

offenbar habe ich das Prinzip von Interfaces und Reference-Counting noch nicht ganz verstanden - zumindest, wenn ich davon ausgehe, dass das Problem mal wieder vor dem Monitor steckt. Ich weiß, warum mein Ansatz nicht funktioniert, aber nicht, wie er funktionieren sollte.

Das Ziel: Ich habe eine Datenstruktur, die ich oft mit unterschiedlichen Aufgaben durchlaufen will. Also so eine Art ein Callback-Thema. Meine Idee war nun, dass diese Datenstruktur eine Routine CallEnumeratorForAllElements bekommt, die als Parameter ein Interface erwartet. Dieses wird dann für jedes Element in der Struktur aufgerufen.

Zunächst das Interface:

Delphi-Quellcode:
  IPlanDataEnumerator = Interface
  ['{BDB4BEB2-FFE4-429A-9007-4DA7D235E92A}']
    procedure HandlePlanDataElement(PD: TPlanData);
  End;



Ein Objekt, das dieses Interface implementiert, ist beispielsweise TMySummary. Die Methode HandlePlanDataElement zählt die Elemente unter bestimmten Bedingungen und erhöht dabei zwei Objektvariablen (Integer).

Wenn ich das Objekt aber wie nachstehend beschrieben verwende, erhalte ich bei Free eine Zugriffsverletzung:

Delphi-Quellcode:
var
  Summary: TMySummary;
begin
  Summary:=TMySummary.Create;
  Summary.Init;
  ProjectData.CallEnumeratorForAllElements(Summary);
  StatusBar.Panels[1].Text:='Unassigned Order Packages: '+IntToStr(Summary.CountUnassignedOrderPackages);
  StatusBar.Panels[2].Text:='Unassigned Orders: '+IntToStr(Summary.CountUnassignedOrders);
  Summary.Free;
end;

Im Debugger bekomme ich für Summary vor dem Aufruf von CallEnumeratorForAllElements noch FRefCount=0, danach einen Wert von -2147483648. Kann ich vestehen, wie schreibt schon Nick Hodges: "...you should never, ever mix interface references with "real" object rereferences to an implementing class. Never." - OK, Nick, but how the hell do we do it then? Hier laufe ich offenbar in die Reference-Count-Falle, so dass mein TSummary-Object vor dem Aufruf von Free schon längst automatisch freigegeben wurde (und mithin auch die Zählwerte für die Tonne sind).

Ich könnte Summary oben natürlich als IPlanDataEnumerator definieren, aber dann geht mir ja der Zugriff auf die beiden Zählvariablen verloren. Und im Sinne eines möglichst universellen Interface wäre es unsinnig, die Zählfunktionen zu implementieren, oder? Wenn ich bei der Verwendung eines Interface den Rest des implementierenden Objekts nicht nutzen kann, könnte ich gleich auf das Interface verzichten und direkt ein Objekt nutzen.

Je mehr ich dazu lese, desto mehr verwirrt das
  Mit Zitat antworten Zitat