Circular Referenz Problem mit Klassen, die sie verwenden
-
22-08-2019 - |
Frage
Ich habe die folgenden zwei Klassen:
TcmTPDataPanel = class(TcmTPBasePanel)
Database: TnxDatabase;
Session: TnxSession;
private
FDataConnector: TcmTPDataConnector;
MyNxDataBase: TnxDatabase;
MyNxSession: TnxSession;
MyRefNxDataBase: TnxDatabase;
protected
procedure Disconnect; virtual; abstract;
procedure Refresh; virtual;
procedure Requery; virtual; abstract;
public
procedure Connect;
published
property DataConnector: TcmTPDataConnector read FDataConnector write
FDataConnector;
end;
TcmTPDataConnector = class(TComponent)
private
FDatabase: TnxDatabase;
FObservers: TList;
FTableForCategories: TnxTable;
FTableForItemCategoryLinks: TnxTable;
FTableForItems: TnxTable;
procedure SetTableForItemCategoryLinks(const Value: TnxTable);
protected
procedure IterateObservers;
public
constructor Create;
destructor Destroy; override;
procedure Register(Instance: TcmTPDataPanel);
procedure Unregister(Instance: TcmTPDataPanel);
published
property Database: TnxDatabase read FDatabase write FDatabase;
property TableForCategories: TnxTable read FTableForCategories write
FTableForCategories;
property TableForItemCategoryLinks: TnxTable read
FTableForItemCategoryLinks write SetTableForItemCategoryLinks;
property TableForItems: TnxTable read FTableForItems write FTableForItems;
end;
TcmDataPanel ist ein (dritte Generation) TFrame Nachkomme. Es ist nicht direkt, sondern mehrere andere zusammengesetzte Komponenten stammen von ihm verwendet.
TcmDataConnector ist eine Komponente, die die Datenbankverbindungsinformationen für diese anderen Komponenten enthält.
Ich bin mit Modelmaker, und ich versuche, ein Beobachter-Muster zu implementieren, so dass mehrere „Datenfelder“ können automatisch aktualisiert werden, wenn die „Data Connector“ den Zustand ändert.
Hier ist mein Problem: Ich kann nicht um das „zirkuläre refernece“ Problem zu bekommen scheinen, da jede Klasse der andere im Interface-Abschnitt verwendet. Putting die dazugehörige „verwendet“ Referenz im Interface-Abschnitt nicht klärt nicht das „nicht deklarierter Bezeichner“ Thema, und sie beide in der gleichen Einheit setzen tut es auch nicht. Gerade jetzt sind sie in der gleichen Einheit (Ich habe versucht, sie in separaten Einheiten, und zusammen), und ich erhalte den „nicht deklarierter Bezeichner: TcmTPDataConnector“ Fehler.
Wie kann ich dieses Problem umgehen?
================
UPDATE:
Es ist Freitagabend um 09.30 Uhr, wo ich bin, und ich war total fest. Nur wenige Minuten nach meinem Post, sparte man die Leute TAG !! (Nacht!) DANKE !!
Man, ich liebe .... SO Stackoverflow meinen Freund in dieser Lern-like-verrückter Saison. :) Danke, danke, danke ...
Lösung
Auf der gleichen Einheit, versuchen Sie wie folgt vor:
TcmTPDataConnector = class(TComponent);
TcmTPDataPanel = class(TcmTPBasePanel)
...
end;
TcmTPDataConnector = class(TComponent)
...
end;
Andere Tipps
Eine weitere Option ist Schnittstellen zu verwenden, aber ich denke, in diesem Fall wäre es overengineered werden.
Zwei Optionen:
1) Setzen Sie sie in der gleichen Einheit, die gleiche Art Block innerhalb dieser Gruppe. Vorwärts erklären TcmTPDataConnector, die andere Art erklären und es dann erklären. (Siehe jcinacio des post)
2) Machen Sie ein Vorfahre von TcmTPDataConnector das enthält, was extern verfügbar sein muss und Ihre Verweise auf das sein lassen. Dies ist eher Kopfschmerzen, aber können Sie es über mehrere Einheiten tun.