加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 在类构造函数中完成类注册时未调用的类构造函数

发布时间:2020-12-15 09:43:03 所属栏目:大数据 来源:网络整理
导读:我正在编写一个基于TDictionary的控制系统的简单依赖注入/反转,它包含抽象类引用及其各自的实现者类. 我的目标是: 避免按类型直接实例化(显然). 在dpr中包含一个类的单元应该足以让它注册并可通过di / ioc系统进行选择和实例化. 仅在实现部分中声明具体的实
我正在编写一个基于TDictionary的控制系统的简单依赖注入/反转,它包含抽象类引用及其各自的实现者类.

我的目标是:

>避免按类型直接实例化(显然).
>在dpr中包含一个类的单元应该足以让它注册并可通过di / ioc系统进行选择和实例化.
>仅在实现部分中声明具体的实现类.
>使用类构造函数而不是初始化部分.

顺便说一句,我知道使用类构造函数来利用智能链接并希望包含一个足以使类可用的单元相互击败.我也想使用类构造函数而不是初始化部分.我想将所有类初始化/注册代码放在一起,而不必在类构造函数和初始化部分之间进行拆分.

问题

我希望将类注册到工厂中的类构造函数中.不幸的是,编译器并不认为通过在自己的类构造函数中使用其类型来“触及”类.

当我将注册函数放在初始化部分时,编译器确实认为该类被触摸并调用类构造函数.但这违背了我在类构造函数中保留所有类初始化代码的操作的目标.

两个问题

>编译器是否应该考虑在自己的类构造函数中使用类“触及类”,还是期望编译器做太多?
>在没有使用初始化部分的情况下,有没有人对如何实现我的目标有任何聪明的想法?

应用程序中使用的抽象类:

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)
> 4个源文件
> groupproj及其所有4个项目的dsk
> RunTestApps.cmd运行所有4个项目
> Results.txt,包含RunTestApps.cmd运行的输出
> WriteUp.txt包含此问题的文本

请记住,在任何时候你都需要做一个“Build All Projecs”,因为所有的dcu和exe都要去源dir,否则你将面临很多错误和/或混乱,因为exe不是做它的名字所表明的.

解决方法

这是预期的.正如Uwe所指出的,自引用类构造函数不足以触发包含.将引用放在初始化部分将完成这个技巧,因为它在类本身之外.尝试自我引用一个类包含类似于试图通过拉自己的吊带拉出自己的深洞.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读