【问题标题】:Can a Delphi generic class descend from its class argument?Delphi 泛型类可以从其类参数继承吗?
【发布时间】:2010-10-21 20:48:20
【问题描述】:

我一直在尝试定义一个通用的、可继承的 TSingleton 类。这是我正在进行的工作:

  TSingleton<RealClass, InheritsFrom : class> = class(InheritsFrom)
  strict private
    class var FInstance : RealClass;
  protected
    procedure InstanceInitialization;virtual;
  public
    destructor Destroy; override;
    class procedure Create; reintroduce;
    class function Instance : RealClass;
    class procedure InstanceFree;
  end;

目标是能够将单例模式“插入”到继承树中。所以不要声明这样的东西:

  TMySingletonComponent = class(TComponent)

  end;

并且需要在那里实现单例模式,我会声明这样的内容:

  TMyGenericSingletonComponent = class(TSingleton<TMyGenericSingletonComponent,TComponent>)
  end;

很遗憾,这行不通。我收到以下错误(在 D2010 中):

  TSingleton<RealClass, InheritsFrom : class> = class(InheritsFrom) ///E2021 Class type required

现在我想知道,这在 Delphi XE 中可以工作吗?是否有一些“干净的技巧”可以用来在 D2010 中完成这项工作?是否有一些根本原因导致这不起作用?

【问题讨论】:

  • 在其他圈子中,您所问的是奇怪地重复出现的模板模式,但泛型不是模板。

标签: delphi generics delphi-2010 delphi-xe crtp


【解决方案1】:

根据设计,您不能创建派生自其类型参数之一的泛型类。

【讨论】:

    【解决方案2】:

    不,这行不通。您正在尝试根据自身定义一个类。无论您放入参数中的任何内容都必须已经完全定义。

    【讨论】:

    • 这不完全正确...如果我将声明更改为 TSingleton = class(TComponent),那么 TMyGenericSingletonComponent = class(TSingleton) 就像一个魅力。在那里,参数还没有完全定义。如果这就是您要根据自身定义一个类的意思,那么它确实有效。
    【解决方案3】:

    你想得到什么?

    恕我直言,单身人士是邪恶的。之所以引入它们是因为 C++ 的糟糕 OOP 设计(据我所知,用于访问控制台应用程序中的输入/输出流)。而且它们往往难以维护。

    没有它们,你总是可以生活。它绝对不是“Delphi 经典”的编程方式,因为 Delphi 没有我提到的 C++ 问题。

    一些 Java 项目 (ab) 对单例的使用。谷歌一下,你就会明白我的意思了。

    使用带有getter的公共类的属性,如果对应的字段仍然为nil,则初始化实例,或者如果已创建实例,则直接返回指向该实例的字段指针。您将拥有单例特性,具有良好的性能、漂亮的代码、良好的 OOP 实践(没有“全局”类),并且如果您以后不需要此特性(用于测试),可以在没有任何单例特性的情况下运行该类目的,例如)。

    【讨论】:

    • 没有为 C++ 引入单例。与结构化编程一样,单例就已经存在了。
    猜你喜欢
    • 2014-12-19
    • 2011-08-13
    • 2010-10-22
    • 2018-10-24
    • 2011-08-19
    • 2011-10-16
    • 2019-07-11
    • 2015-11-18
    相关资源
    最近更新 更多