与使用对方的类循环引用问题(Circular reference issue with Classe

2019-09-26 01:24发布

我有以下两类:

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中,并想实现一个Observer模式,使多个“数据面板”可自动更新每当“数据连接”改变状态。

这里是我的问题:我似乎无法避开“循环refernece”的问题,因为每个类的接口部分使用其他。 把在接口部分相关的“使用”引用不清理“未申报的标识”的问题,并把他们都在同一个单位确实没有。 现在他们都在同一单位(我尝试过不同的装置,并一起),我也得到了“未声明的标识符:TcmTPDataConnector”的错误。

我怎样才能解决这个问题?

================
更新:

这是星期五晚上在下午9:30我在哪里,我是完全卡住。 短短几分钟内我的帖子后,你的人化险为夷! (夜!)谢谢!

男人,我爱StackOverflow的....所以我的朋友在这个学习般的疯狂季节。 : ) 谢谢你,谢谢你,谢谢你...

Answer 1:

在相同的单位,请尝试以下操作:

TcmTPDataConnector = class(TComponent);


TcmTPDataPanel = class(TcmTPBasePanel)
   ... 
end;

TcmTPDataConnector = class(TComponent)
  ...
end;


Answer 2:

另一种选择是使用的接口,但我认为在这种情况下,它会被过度设计。



Answer 3:

有两种选择:

1)把它们在同一个单元中,其内的相同类型块。 远期声明TcmTPDataConnector,声明其他类型的再申报。 (见jcinacio的帖子)

2)使包含什么需要可在外部,使您的引用是该TcmTPDataConnector的祖先。 这更是一个头疼的,但可以让你在多个单位做到这一点。



文章来源: Circular reference issue with Classes which use each other