Delphi泛型类能否从其类参数派生?

Delphi泛型类能否从其类参数派生?,delphi,generics,delphi-2010,delphi-xe,crtp,Delphi,Generics,Delphi 2010,Delphi Xe,Crtp,我一直在尝试定义一个通用的、可继承的TSingleton类。以下是我正在进行的工作: TSingleton<RealClass, InheritsFrom : class> = class(InheritsFrom) strict private class var FInstance : RealClass; protected procedure InstanceInitialization;virtual; public destruct

我一直在尝试定义一个通用的、可继承的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;
TMyGenericSingletonComponent=class(青岛)
结束;
遗憾的是,这行不通。我得到以下错误(在D2010中):

tingleton=class(InheritsFrom)///E2021所需的类类型

现在我想知道,这在Delphi XE中是否有效?是否有一些“干净的黑客”我可以用来使这项工作在D2010?有没有一些根本原因可以解释为什么这样做行不通?

不,这样做行不通。您试图用类本身来定义一个类。无论在参数中放置什么,都必须完全定义。

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

您希望获得什么

嗯,单身是邪恶的。他们之所以引入是因为C++的糟糕的OOP设计(对于在控制台应用程序中的输入/输出流的访问,就我所记得的)而言。而且他们倾向于拼命维持

没有它们,你永远可以活下去。它肯定不是一个“Delphi经典”的编程方法,因为Delphi不受我提到的C++问题的影响。 一些Java项目(ab)使用单例。谷歌搜索,你就会明白我的意思


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

在其他圈子中,您所问的问题被称为奇怪的重复模板模式,但是泛型不是模板。这不完全正确。。。如果我将声明更改为TSingleton=class(TComponent),那么TMyGenericSingletonComponent=class(TSingleton)就像一个符咒一样工作。在这里,参数还没有完全定义。如果这是你定义一个类本身的意思,那么它确实有效。C++没有引入单体。单例程序的存在时间和结构化编程一样长。
  TSingleton<RealClass, InheritsFrom : class> = class(InheritsFrom) ///E2021 Class type required