2010-10-21 80 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

相關問題