Delphi泛型类能否从其类参数派生?
我一直在尝试定义一个通用的、可继承的TSingleton类。以下是我正在进行的工作: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<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