problema riferimento circolare con classi che utilizzano reciprocamente
-
22-08-2019 - |
Domanda
Ho le seguenti due classi:
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 è un (3a generazione) TFrame discendente. Non è utilizzato direttamente, ma piuttosto più altri componenti composti discendono da esso.
TcmDataConnector è un componente che contiene le informazioni di connessione al database per questi altri componenti.
sto usando ModelMaker, e sto cercando di realizzare un pattern Observer in modo che più "Pannelli dati" possono essere aggiornati automaticamente ogni volta che la "Data Connector" cambia stato.
Ecco il mio problema: non riesco ad aggirare il problema "circolare refernece", in quanto ogni classe utilizza l'altro nella sezione Interface. Mettere il "usa" riferimento associato nella sezione di interfaccia non chiarire il problema "identificatore non dichiarato", ed entrambi messa nella stessa unità non sia. Per ora sono nella stessa unità (io li ho provato in unità separate, e insieme), e ho la "identificatore non dichiarato: TcmTPDataConnector" errore.
Come posso ottenere intorno a questo?
================
UPDATE:
E 'Venerdì sera alle 9:30 pm dove sono, e mi era totalmente bloccato. Pochi minuti dopo il mio post, voi gente salvato la giornata !! (Di notte!) GRAZIE !!
L'uomo, amo StackOverflow .... così il mio amico in questa stagione di apprendimento-like-matto. :) Grazie, grazie, grazie ...
Soluzione
Sulla stessa unità, provare quanto segue:
TcmTPDataConnector = class(TComponent);
TcmTPDataPanel = class(TcmTPBasePanel)
...
end;
TcmTPDataConnector = class(TComponent)
...
end;
Altri suggerimenti
Ancora un'altra opzione è quella di utilizzare le interfacce, ma credo che in questo caso sarebbe overengineered.
Due opzioni:
1) Metteteli nella stessa unità, lo stesso blocco di tipo all'interno di esso. Forward dichiarare TcmTPDataConnector, dichiarare l'altro tipo e poi dichiararla. (Vedi post del jcinacio)
2) Fare un antenato di TcmTPDataConnector che contiene ciò che deve essere disponibile esternamente e fare i vostri riferimenti siano a questo. Questo è più di un mal di testa, ma consente di farlo su più unità.