2010-10-21 54 views
4

我一直在试图定义一个通用的,可继承的TSingleton类。以下是我正在进行的操作:Delphi泛型类可以从它的类参数中下降吗?

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中完成这项工作?有没有一些根本的原因,为什么这不能工作?

+3

在其他圈子中,你所问的是*好奇的循环模板模式*,但泛型不是模板。 – 2010-10-21 22:15:05

回答

5

通过设计,您不能创建从其类型参数派生的泛型类。

3

不,这是行不通的。你试图根据自己来定义一个类。无论你在参数中放置什么,都必须已经完全定义。

+0

这并不完全正确......如果我将声明更改为TSingleton = class(TComponent),那么TMyGenericSingletonComponent = class(TSingleton )就像一个魅力。在那里,参数还没有完全定义。如果这就是你自己定义一个类的含义,那么它确实有用。 – 2010-10-22 02:50:45

2

你想获得什么?

恕我直言,单身是邪恶的。他们之所以被介绍是因为C++的糟糕的OOP设计(用于访问控制台应用程序中的输入/输出流,据我所知)。他们往往像地狱一样要保持。

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

一些Java项目(ab)使用singleton。谷歌为它,你会发现我的意思。

使用普通类的属性与getter,初始化一个实例,如果对应的字段仍然为零,或者如果它已经创建领域指针直接返回到该实例。如果你以后不需要这个特性,你将拥有单例特性,具有良好的性能,良好的代码,良好的面向对象实践(没有“全局”类),以及没有任何单例特性的情况下运行该类的能力。目的,例如)。

+0

C++没有引入单身人士。只要结构化编程已经存在,单身已经存在。 – 2010-10-29 18:30:31

相关问题