与使用对方的类循环引用问题
-
22-08-2019 - |
题
我有以下两类:
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是一个(第3代)TFRAME后代。它不能直接使用,而是其他多种复合成分,从它下降。
TcmDataConnector是保存用于这些其它组分数据库连接信息的组件。
我使用MM中,并想实现一个观察者模式使得多个“数据面板”可自动更新每当“数据连接器”改变状态。
下面是我的问题:我似乎无法避开“循环refernece”的问题,因为每个类的接口部分使用其他。把在接口部分相关的“使用”引用不清理“未申报的标识”的问题,并把他们都在同一个单位确实没有。现在他们都在同一单位(我尝试过不同的装置,并一起),我也得到了“未声明的标识符:TcmTPDataConnector”的错误。
我怎样才能解决这个问题?
=====结果 UPDATE:
这是星期五晚上在下午9:30我在哪里,我是完全卡住。短短几分钟内我的帖子后,你的人化险为夷! (夜!)谢谢!
男人,我爱StackOverflow的....所以我的朋友在这个学习般的疯狂季节。 :)谢谢你,谢谢你,谢谢你...
解决方案
在同一单元中,尝试以下方法:
TcmTPDataConnector = class(TComponent);
TcmTPDataPanel = class(TcmTPBasePanel)
...
end;
TcmTPDataConnector = class(TComponent)
...
end;
其他提示
另一种选择是使用的接口,但我认为在这种情况下,它会被过度设计。
有两个选项:
1)把它们在同一个单元中,其内的相同类型块。远期声明TcmTPDataConnector,声明其他类型的再申报。 (参见jcinacio的交)
2)使包含什么需要可在外部,使您的引用是该TcmTPDataConnector的祖先。这更是一个头疼的,但可以让你在多个单位做到这一点。
不隶属于 StackOverflow