上课之间的循环引用

ram*_*omd 4 delphi oop circular-reference

我需要开发下一个图表类: 在此输入图像描述
我写了代码,但是,有循环单元引用的问题.

XmlFileManager类包含:

unit XmlFileManager;
interface
uses
  xmldom, XMLIntf, msxmldom, XMLDoc, SysUtils, DateUtils, Classes, Dialogs,
  XmlEnpManager;
type
  TXmlFileManager = class
  private
    [...]
    xmEnp: TXmlEnpManager;
    xmEnpInicial: TXmlEnpManager;
    xmEnpFinal: TXmlEnpManager;
[...]
end.
Run Code Online (Sandbox Code Playgroud)

抽象类,XmlNodeManager:

unit XmlNodeManager;
interface
uses
  xmldom, XMLIntf, msxmldom, XMLDoc, SysUtils, DateUtils, Classes, Dialogs,
  XmlFileManager;
type
  TXmlNodeManager = class
   protected
        { sgy alias para strategy }
        sgyIterator: Integer;
        sgyContext: TXmlFileManager;
        sgyAttributes: TStringList;
        sgyNode: IXMLNode;
[...]
end.
Run Code Online (Sandbox Code Playgroud)

和XmlEnpManager具体类:

unit XmlEnpManager;
interface
uses
  xmldom, XMLIntf, msxmldom, XMLDoc, SysUtils, DateUtils, Classes, Dialogs,
  XmlNodeManager;
type
  TXmlEnpManager = class (TXmlNodeManager)
    public
        constructor Create(aContext: TXmlFileManager); overload; override;
        constructor CreateInicial(aContext: TXmlFileManager); reintroduce; overload;
        constructor CreateFinal(aContext: TXmlFileManager); reintroduce; overload;
[...]
end.
Run Code Online (Sandbox Code Playgroud)

构建失败并出现错误:

[dcc32致命错误] XmlNodeManager.pas(7):F2047循环单元引用'XmlFileManager'

任何想法如何解决这个问题?

Jer*_*ers 5

TXmlFileManagerTXmlNodeManager同时在相同的unit和相同的type部分,然后确保type部分与此类前开始:TXmlNodeManager = class;

请参阅官方文档:转发声明和相互依赖的类.

unit XmlFileManagerAndXmlNodeManager;
interface
uses
  xmldom, XMLIntf, msxmldom, XMLDoc, SysUtils, DateUtils, Classes, Dialogs,
[...]

type
  TXmlNodeManager = class;

  TXmlFileManager = class
  private
    [...]
    xmEnp: TXmlEnpManager;
    xmEnpInicial: TXmlEnpManager;
    xmEnpFinal: TXmlEnpManager;
[...]

  TXmlNodeManager = class
   protected
        sgyIterator: Integer;
        sgyContext: TXmlFileManager;
        sgyAttributes: TStringList;
        sgyNode: IXMLNode;
[...]
end.
Run Code Online (Sandbox Code Playgroud)