4

我一直在尝试定义一个通用的、可继承的 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 中完成这项工作?有一些根本原因导致这行不通吗?

4

3 回答 3

5

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

于 2010-10-22T03:54:58.750 回答
3

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

于 2010-10-21T21:00:34.033 回答
2

你想获得什么?

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

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

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

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

于 2010-10-22T06:03:25.463 回答