Mar*_*ema 4 delphi class-constructors
我正在编写一个基于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;
Run Code Online (Sandbox Code Playgroud)
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;
Run Code Online (Sandbox Code Playgroud)
获取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;
Run Code Online (Sandbox Code Playgroud)
目前这是在一个单独的功能中编码,但它可以移动到工厂.
完整的示例代码
如果有人想进行实验,我可以在以下网址找到我的测试项目的完整代码:http://www.bjsoftware.com/delphistuff/stackoverdlow/classconstructors.zip
邮编内容:
请记住,在任何时候你都需要做一个"Build All Projecs",因为所有的dcu和exe都要去源dir,否则你将面临很多错误和/或混乱,因为exe不是做它的名字所表明的.
这是预期的.正如Uwe所指出的,自引用类构造函数不足以触发包含.将引用放在初始化部分将完成这个技巧,因为它在类本身之外.尝试自我引用一个类包含类似于试图通过拉自己的吊带拉出自己的深洞.
只要您不在类本身之外的任何地方使用该类,编译器就会将此作为完全不使用的类,因此不会调用类构造函数.所以我想你必须使用初始化部分而不是调整代码来欺骗编译器.采取务实的方法而不是教条方法.无论如何它会更具可读性.
归档时间: |
|
查看次数: |
1203 次 |
最近记录: |