![]() |
Problem mit Interfaces
Hallo,
ich verzweifle gerade an Interfaces. Das Problem ist die Stelle // XXX // Danach wird der Speicher der lokalen Varaible TestId überschrieben. Ich denke, der Fehler liegt im GetInterface. Nur wie soll ich denn sonst ein Interface auf die Klasse bekommen ???. Unteres Bsp führt zum Überschreiben der lokalen Variabel TestCode. Was mache ich falsch ? Ich will von dieser Basisklasse weg, also bitte keine "pack das property doch in die Basisklasse" Danke Heiko
Delphi-Quellcode:
type
IResource = interface function GetResType: Integer; property iResType: Integer read GetResType end; type TBaseRes = class(TInterfacedClass) function GetInterface: IResource; virtual; abstract; end; // Res1 type TRes1 = class(TBaseRes, IRes) function GetInterface: IResource; override; function GetResType: Integer; end; function TRes1.GetInterface: IResource; var IntRes: IResource; begin IntRes:= Self; Result:= IntRes; end; function TRes1.GetResType: Integer; begin Result:= 1; end; // Res2 type TRes2 = class(TBaseRes, IRes) function GetInterface: IResource; override; function GetResType: Integer; end; function TRes2.GetInterface: IResource; var IntRes: IResource; begin IntRes:= Self; Result:= IntRes; end; function TRes2.GetResType: Integer; begin Result:= 2; end; // problem code var iResItem : Integer; ResItem : TBaseRes; IntRes : IResource; TestId : Integer; begin TestId:= 100; for iResItem:= 0 to ResList.Count-1 do begin ResItem:= ResList[iResItem]; IntRes:= ResItem.GetInterface; // XXX // if IntRes.iResType=1 do begin blaaa // TestId wurde verändert !! end; |
Re: Problem mit Interfaces
Hallo,
Zitat:
Zitat:
Zitat:
Hier noch ein kleiner Link zu meinem ![]() Gruß xaromz |
Re: Problem mit Interfaces
Zitat:
|
Re: Problem mit Interfaces
Hallo,
Das Problem beim Ersetzen ist ... viiiiiieeeell Code. ;( Es war ja nur als Bsp. gedacht. Die dahinterliegenden Klassen sind "etwas" größer, so ein paar tausend Zeilen müssen geändert und vor allem getestet werden. Ich will die nach und nach umstellen. Dafür ist das GetInterface da. Das <iResType> property war das erste, was ich umstellen wollte. Das hatte ich in 3 Stunden erledigt. Und dann kommt es jetzt zu diesem Speicherfehler. Ich werde mir mal das Tutorial ansehen . Mein Frage zielte ja darauf hin, ob in dem Code ein prinzipieller Fehler ist. Heiko |
Re: Problem mit Interfaces
Zitat:
Auch ist das Mischen von Klassen und Interfacezugriffen problematisch. Hier gibt es eine Fall bei Delphi wo die automatische Referenzzählung durcheinander kommt und das Objekt schon freigegeben wird. Und dies ist vermutlich bei deiner GetInterface-Methode mit der lokalen Variable der Fall. |
Re: Problem mit Interfaces
Hallo Bernhard,
meinst du
Delphi-Quellcode:
??
var
iResItem : Integer; ResItem : TBaseRes; Res_1 : TRes1; IntRes : IResource; TestId : Integer; begin TestId:= 100; for iResItem:= 0 to ResList.Count-1 do begin ResItem:= ResList[iResItem]; if ResItem is TRes1 then begin Res_1:= ResList[iResItem]; end; Darauf bin ich ja noch gar nicht gekommen ... Nach dem Lesen des Tutorials (speziell das Mischen von Klassen und Interfaces) habe ich aber den alten Stand wieder ausgecheckt. Ich wollte 3 völlig verschiedenen Klassen (Person,Arbeitsplatz,Fahrzeug) mehrere neue gemeinsame Eigenschaften (Resourcentyp, Ressourcenname) zuordnen, ohne sie von einer einzelnen Basisklasse abzuleiten. Alle 3 Klassen haben aber selber schon ne Menge eigener Properties. Deshalb dachte ich, Interfaces wären eine gute Idee. Alle "Ressourcen" wurden dann in eine TList geladen und über das gemeinsame Interface zugreifen. Das war der Plan .. Heiko |
Re: Problem mit Interfaces
Hallo,
Zitat:
Schau Dir mal .Net an. Da kannst Du immer Klassen und Interfaces mischen, weil das in allen Sprachen von Anfang an so vorgesehen war (die Referenzzählung ist ja sowieso für den GC notwendig). Gruß xaromz |
Re: Problem mit Interfaces
Hallo,
gerade aus .Net hatte ich die Überlegung. In einem Artikel des .net Magazins stand das mal drin. Was mich stört ist, dass die Klasse zerstört wird, wenn der Referenzzeiger 0 ist. Naja, man sollte halt neue Sachen an einfachen Testprogrammem ausprobieren. Ich hatte das gleich eingebaut ... Heiko |
Re: Problem mit Interfaces
Zitat:
Zitat:
GC über Referenzzählung ist nur eine möglicher ![]() |
Re: Problem mit Interfaces
Hallo,
Zitat:
Zitat:
Gruß xaromz |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:12 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz