Delphi泛型类能够从其类参数继承吗?

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中工作?是否存在一些根本性原因,导致这不能工作?


3
在其他领域,你所询问的被称为“奇异递归模板模式”,但是泛型并不是模板。 - Rob Kennedy
3个回答

6

按照设计,您无法创建从其类型参数派生的通用类。


3
不行,那样做不起作用。你试图根据自身定义一个类。无论你在参数中放入什么,都必须已经完全定义好了。

1
这并不完全正确...如果我将声明更改为TSingleton<RealClass : class> = class(TComponent),那么TMyGenericSingletonComponent = class(TSingleton<TMyGenericSingletonComponent>)就可以完美运行。在这里,参数还没有完全定义。如果你所说的是通过自身来定义一个类,那么它确实可以工作。 - Ken Bourassa

2

你想获得什么?

在我看来,单例模式是有害的。它们是由于 C++ 的糟糕面向对象设计引入的(为了访问控制台应用程序中的输入/输出流,据我所知)。而且它们往往难以维护。

你总是可以不使用它们。这明显不是“Delphi经典”编程方式,因为 Delphi 没有我提到的 C++ 问题。

一些 Java 项目滥用了单例模式。搜索一下,你就会知道我的意思。

使用一个常规类的属性和 getter,如果相应字段仍为空,则初始化实例,否则直接返回指向实例的字段指针。这样你就拥有了单例模式的功能,具有良好的性能、优美的代码、良好的面向对象实践(没有“全局”类),并且如果以后不需要此功能(例如进行测试),则可以在不运行该类的情况下运行。


单例模式并不是为C++引入的。自结构化编程以来,单例模式就一直存在。 - Rob Kennedy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接