是否可以在 Delphi 中创建泛型类的类型别名

lvmkulzt  于 2022-12-12  发布在  其他
关注(0)|答案(3)|浏览(205)

我想为一个泛型类定义一个类类型(类型别名)。我想这样做,这样单元B的用户就可以在不使用单元a的情况下访问TMyType。我有这样的单元:

unit a;
interface
type
  TMyNormalObject = class
    FData: Integer;
  end;
  TMyType<T> = class
    FData: <T>;
  end;
implementation
end.

unit b;
interface
type
  TMyNormalObject = a.TMyNormalObject;  // works
  TMyType<T> = a.TMyType<T>; // E2508 type parameters not allowed on this type
implementation
end.

我已经找到了一个可能的变通方案,但我不喜欢,因为它可能会引入难以找到的错误:

TMyType<T> = class(a.TMyType<T>);

这种方法的问题在于它引入了一个新的类类型,并且一个a.TMyType示例不是一个b.TMyType(而a. TMyNormalClass是一个b.TMyNormalClass,反之亦然--它们引用的是同一个类)。

mec1mxoz

mec1mxoz1#

目前还不能为泛型类声明类类型。
请参阅QC76605以取得更多信息。以及下列更新。
示例:

TMyClass<T> = class
end;
TMyClassClass<T> = class of TMyClass<T>; //E2508 type parameters not allowed on this type

所提供的解决方法如下所示:

TMyIntClass = TMyType<Integer>;
TMyIntClassClass = Class of TMyIntClass;

但正如所评论的,这将挫败泛型的整个想法,因为类必须为每个泛型示例化子类化。
下面还有一个链接,指向生成泛型类型的专用子类的类似解决方法:derive-from-specialized-generic-types。在本例中,它将如下所示:

TMySpecialClass = Class(TMyType<Integer>);

更新日期:

RM提议的解决方法:

TMyType<T> = class(a.TMyType<T>);

可以使用以下方案实现类型安全:
第一个
当创建泛型类时,进行测试以检查所创建的类是从单元B中声明的类型派生的。由此,检测到从单元a创建该类的所有尝试。

更新2:

需要说明的是,对泛型类“class of type<T>“的引用是不可能的,但泛型类的副本是可以的。

iqxoj9l9

iqxoj9l92#

因为不可能为泛型类声明“类型别名”,所以这里有一个使用interface的解决方案。
第一个

gjmwrych

gjmwrych3#

type

TMyC = T的阵列;
TMyD = TMyC<...integer...>;
步骤X;
变量
t4:TMyD;
开始
t4:= [1];
对于变量i:整数:=低(t4)至高(t4)do
(t4[i].ToString);
结束;

相关问题