我在每个单元中有两个单元和一个类,需要彼此运行。如何避免循环引用?

时间:2015-04-27 22:14:25

标签: delphi delphi-xe2

我有两个课程,ClassAClassB,每个课程都有自己的单独部分,UnitAUnitB

UnitA使用UnitB。这允许ClassA调用ClassB的构造函数。但ClassB's功能的一部分需要使用ClassA's方法。我无法使UnitB使用UnitA,否则会导致循环引用。允许ClassBClassA's内访问UnitB方法有哪些替代方法?

3 个答案:

答案 0 :(得分:8)

这很大程度上取决于两个类如何相互使用。如果一个类在实现中使用另一个类而不是接口,那么您可以将uses单元中的该单元从<cfset id = ""> 部分向下移动到function name#id# () 部分。

这可以解决这个问题:

interface

implementation

但是,如果两个类的接口彼此依赖,那么您别无选择,只能将两个类放在同一个单元中(并使用前向声明)。

UnitA;

interface

uses
  Classes, UnitB;

type
  TClassA = class(TObject)
  end;

...

在极少数情况下,您甚至可以将整个班级定义向下移动到UnitB; interface uses Classes; type TClassB = class(TObject) end; implementation uses UnitA; ... 。如果您需要在其他地方实际使用该类,那将不会有用。

UnitA;

interface

uses
  Classes;

type
  TClassA = class;
  TClassB = class;


  TClassA = class(TObject)
  end;

  TClassB = class(TObject)
  end;

...

根据复杂性,将共同代码放在自己的单独单元中也是常见的做法。例如常量,记录数组类型,全局变量等。这个公共单位不得使用任何其他单位。

答案 1 :(得分:2)

为了扩展前一个答案,另一个可能性(尽管肯定不太可读)是指两个都具有访问权限的祖先(在极端情况下为TObject),然后在实现阶段进行转换。所以

interface

TClassA = class
...
fRefToClassB : TObject;  // internal ref
...
procedure UsingBRef( pVar : TObject );
...
end;

implementation

procedure TClassA.UsingClassB
begin
  with fRefToClass as TClassB do
...
end;

procedure TClassB.UsingBRef( pVar : TObject );
begin
  with pVar as TClassB do
...
end;

显然主题有很多变化,你实现的比这更好。我再次强调先前的解决方案更好,但是当其他所有方法都失败时,这会提供一个解决方案。

答案 2 :(得分:0)

如果您有ClassA和ClassB,并且都使用ClassA中的方法,那么您可能希望将这些方法从ClassA重构为它们的单元(如果您喜欢,则为类)。