读书人

定义类循环引用异常该如何避免

发布时间: 2013-04-09 16:45:09 作者: rapoo

定义类,循环引用错误,该如何处理?
现有2个单元,分别有部门类、员工类。 期望定义如下:

部门:


unit unDep;
interface
uses unEmp;
type
TDep = class(TObject)
public
depID: string; //部门ID
depName: string; //部门名
depEmpCount: Integer; //部门员工数
depEmpList: array of TEmp; //部门员工列表 -----------------
depParentDepID: string; //父部门ID (若无父部门则为空)
ParentDep: TDep; //上级部门对象 ====
constructor Create();
destructor Destroy; override;
end;

implementation
uses unFrmMain;


员工:

unit unEmp;
interface
uses unDep;
type
TEmp = class(TObject)
public
empID: string; //用户ID号
empName: string; //用户姓名
ParentDep: TObject; //部门对象 ===
constructor Create;
destructor Destroy; override;
end;

implementation
uses unFrmMain;


因为在interface中都分别uses对方,会造成循环也能用错误。
那么这种需求该如何定义呢?
interface uses 循环引用 类定义
[解决办法]
放在implementation下面的uses
[解决办法]
不行放在一元面 哈哈 就解了
[解决办法]
引用:
楼上的,放在一个单元里,也有前后的问题。前面的类不能有后面类类型的成员。

当然如我代码中用 TObject 类型也可以,但使用起来非得用个 TDep(XXX).XX 感觉很麻烦。


在implementation下声明个局部全局变量
var
FFDep:TDep;

在类的构造函数里转
FFDep:=TDep(XXX);

这样类就可以在不同的单元了


[解决办法]
两种方法:
1. 放在同一个unit中
2. 分别把引用的单元放在interface部分和implementation不同的部分,要错开。

问题:
1.类的职责不清
2.如果只是数据,没有其他作用,这两个类不定义也可,意义不大,而且增加了代码的复杂度。

细节:
既然定义了部门对象,为什么还要放TObject类型的变量?
如下所示:
ParentDep: TObject; //部门对象 ===

结论:
想法也许是好的,做法有点混乱。
[解决办法]
引用:
不行放在一元面 哈哈 就解了


+1

读书人网 >.NET

热点推荐