delphi – 在类构造函数中完成类注册时未调用的类构造函数
我正在编写一个基于TDictionary的控制系统的简单依赖注入/反转,它包含抽象类引用及其各自的实现者类.
我的目标是: >避免按类型直接实例化(显然). 顺便说一句,我知道使用类构造函数来利用智能链接并希望包含一个足以使类可用的单元相互击败.我也想使用类构造函数而不是初始化部分.我想将所有类初始化/注册代码放在一起,而不必在类构造函数和初始化部分之间进行拆分. 问题 我希望将类注册到工厂中的类构造函数中.不幸的是,编译器并不认为通过在自己的类构造函数中使用其类型来“触及”类. 当我将注册函数放在初始化部分时,编译器确实认为该类被触摸并调用类构造函数.但这违背了我在类构造函数中保留所有类初始化代码的操作的目标. 两个问题 >编译器是否应该考虑在自己的类构造函数中使用类“触及类”,还是期望编译器做太多? 例 应用程序中使用的抽象类: TSite = class abstract (TObject) function GetURL: string; virtual; abstract; property URL: string read GetURL; end; TSites = class (TList<TSite>); TThisApplication = class abstract (TObject) function Sites: TSites; virtual; abstract; end; TThisApplication的具体实现类(在实现部分中声明!) TThisApplicationConcrete = class(TThisApplication) class constructor ClassCreate; strict private FSites: TSites; function Sites: TSites; override; end; class constructor TThisApplicationConcrete.ClassCreate; begin RegisterImplementorClass(TThisApplication,TThisApplicationConcrete); end; function TThisApplicationConcrete.Sites: TSites; var SiteList: TSites; begin if not Assigned(FSites) then begin SiteList := TSites.Create; // Change to use factory //RetrieveSites(SiteList); FSites := SiteList; end; Result := FSites; end; 获取TThisApplication实例的函数: function ThisApplication: TThisApplication; var ImplementorClass: TClass; begin ImplementorClass := GetImplementorClass(TThisApplication); if Assigned(ImplementorClass) then begin Result := ImplementorClass.Create as TThisApplication; end else begin Result := nil; end; end; 目前这是在一个单独的功能中编码,但它可以移动到工厂. 完整的示例代码 如果有人想要试验,我可以在http://www.bjsoftware.com/delphistuff/stackoverdlow/classconstructors.zip获得我的测试项目的完整代码 邮编内容: > 4个项目全部使用相同的源文件,仅在条件定义中有所不同(这也是为什么还包括dproj) 请记住,在任何时候你都需要做一个“Build All Projecs”,因为所有的dcu和exe都要去源dir,否则你将面临很多错误和/或混乱,因为exe不是做它的名字所表明的. 解决方法
这是预期的.正如Uwe所指出的,自引用类构造函数不足以触发包含.将引用放在初始化部分将完成这个技巧,因为它在类本身之外.尝试自我引用一个类包含类似于试图通过拉自己的吊带拉出自己的深洞.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |