我有两个课程,ClassA
和ClassB
,每个课程都有自己的单独部分,UnitA
和UnitB
。
UnitA
使用UnitB
。这允许ClassA
调用ClassB
的构造函数。但ClassB's
功能的一部分需要使用ClassA's
方法。我无法使UnitB
使用UnitA
,否则会导致循环引用。允许ClassB
从ClassA's
内访问UnitB
方法有哪些替代方法?
答案 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重构为它们的单元(如果您喜欢,则为类)。