Diesiges Wetter. Zeit, wieder über zirkuläre
Unit-Referenzen zu plauschen
Vielleicht bin ich noch zu neu in Delphi, aber ich finde das Thema ist nicht gegessen. Ich habe aktuell auch (glücklicherweise nur ein oder zwei) Fälle, in denen sich zwei Klassen gegenseitig kennen müssen. Alles direkt mit "Das ist schon Zeuge genug für schlechtes Design, mach es irgendwie anders" abzuwürgen ist mir zu billig.
Hier nun eine interessante Methode, zirkuläre Referenzen mit Class Helpern noch einmal neu anzugehen:
Solving circular unit references with class helpers. Ich habe hier im Forum noch keine heißblütig geführten Diskussionen dazu gefunden. Deshalb nun dieses Thema.
Zusammenfassung: Alt
bewährtesbekanntes Halten einer (protected) Referenz vom Typ
TObject
, Casten auf den richtigen Typ mittels Helferklassen-Methode (oder Property).
Was haltet ihr davon? Das einzige was mich stört: Man könnte vergessen, die Helfer-
Unit einzubinden und sich anschließlich wundern, wo denn der Verweis (bsp. des Hundes auf seinen Halter) steckt.
Hier einmal noch die Kurzfassung:
Delphi-Quellcode:
// Hundebesitzer.pas
uses
Hund
;
type THundebesitzer = class
public var
name: String;
hund: THund;
end;
Delphi-Quellcode:
// Hund.pas
type
THund = class
protected var // An 'private' kommt auch ein Helper nicht mehr ran
besitzer_uncasted: TObject;
public var
name: String;
end;
Delphi-Quellcode:
// HundHelper.pas
uses
Hund,
Hundbesitzer
;
type
THundHelper =
class helper
for THund
private
function GetBesitzer: THundebesitzer;
procedure SetBesitzer(
const Value: THundebesitzer);
public
property besitzer: THundebesitzer
read Getbesitzer
write Setbesitzer;
end;
implementation
function THundHelper.Getbesitzer: THundebesitzer;
begin
if besitzer_uncasted
is THundebesitzer
then
Result := besitzer_uncasted
as THundebesitzer
else
Result :=
nil //Oder Exception?
;
end;