gpt4 book ai didi

delphi - delphi中的接口(interface)和构造函数

转载 作者:行者123 更新时间:2023-12-03 14:41:35 25 4
gpt4 key购买 nike

我正在为业务对象编写一个框架。我大量使用接口(interface)是因为:

1) 自动内存管理
2)关注点分离

通常构造函数有一些参数是框架的对象,但我不能将它们放在接口(interface)中。

我的问题是,如果我使用接口(interface)来分离实现它们的类,为什么我的代码最终仍然绑定(bind)到实现接口(interface)以调用构造函数及其参数的具体类。和

将创建者代码放入工厂方法有什么好处? (我还没用过的东西..)

谢谢!

===编辑===

我的问题的要点是构造函数的参数。在框架中,许多对象需要其他一些对象才能工作。答案很好地解决了关注点分离的问题,但我仍然不知道如何解决参数问题..

如果我不采用构造函数方式,我应该在对象的每个方法中采用“过程初始化”方式(在接口(interface)中)和“CheckObjectInitialized”( protected )。这会如何更干净?

最佳答案

工厂方法将允许您在一个位置注册接口(interface)的实现者,并允许其余代码“仅请求实现者”。

Factory.GetImplementorOf(IMyInterface)

然后返回一个接口(interface)引用。

如何实现工厂取决于您。您可以为请求的每个接口(interface)创建新实例,维护已创建实例的池并返回对这些实例的引用,或者根据请求的接口(interface)进行混合。

您还可以决定是否希望工厂允许同一接口(interface)的多个实现者(那么您如何选择正确的实现者),或者为每个接口(interface)或混合接口(interface)强制使用单个实现者。

多个实例可以派上用场,例如,在处理有时可能不可用的重复服务时,您可以选择一个恰好可用的服务。

提供 GetImplementorOf(接口(interface)数组)也可能是一个想法。因此,您可以拥有多个 IDump 实现者,但可以通过转储信息的方式来区分它们:例如 IDump 是 IHTML 格式对象的实现者。

<小时/>

are factories prepared to work with constructors parameters in some clean way??

现在,这是一个有趣的问题。不,它们本身并不是。工厂通常使用标准构造函数,可能采用“Owner”和/或“Id”参数。

如果你想在每个类的基础上有更具体的构造函数,你必须

  • 创建更多工厂,这违背了单点注册接口(interface)实现者的目的
  • 允许基于每个接口(interface)/类的初始化方法,这些方法应在构造后立即调用,这会使您的代码容易健忘,并使类不那么不可变。
  • 或者想出一种方法将构造函数签名知识合并到工厂中。

在某个阶段我选择了第三个选项。通过创建一个工厂来实现

  • 需要注册具有抽象基类的接口(interface)
  • 需要从抽象基类派生的实现者
  • 返回实现者作为元类引用而不是实例
    TFactory = class(...)    public      procedure RegisterInterface(const aGUID: TGUID; const aAbstractBase: TClass);      procedure RegisterImplementor(const aGUID: TGUID; const aImplementor: TClass);      function GetImplementor(const aGUID: TGUID): TClass;

缺点:

  • 必须同时声明接口(interface)和抽象基类,这非常麻烦。
  • 它击败了单继承语言中接口(interface)的“接口(interface)多重继承”优势。
  • 您需要在整个代码中传播接口(interface)/抽象基类对的知识,否则您仍然无法使用特定于类的构造函数。泛型可能会有所帮助,但我还没有研究过这一点。
  • 如果您没有相同(一组)接口(interface)的多个实现者,那么它就没有任何实际意义。
  • 即使您只需要多个实现者来进行单元测试,这似乎也有些过头了。我发现在测试单元中声明的虚拟类与类接口(interface)的相关部分更加有用和有效。

总而言之,我回到了标准构造函数/特定初始化对方法。编写代码扫描单元测试来检查工厂的每个 GetImplementor 调用后面是否都跟着初始化调用应该相当容易。尽管理论上类不再像特定构造函数那样不可变,但它仍然适用于所有实际目的。如果您想确保仅在构造后立即调用 Initialize 方法,那么应该很容易添加。

关于delphi - delphi中的接口(interface)和构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7990070/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com