我想为一个泛型类定义一个类类型(类型别名)。我想这样做,这样单元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,反之亦然--它们引用的是同一个类)。
3条答案
按热度按时间mec1mxoz1#
目前还不能为泛型类声明类类型。
请参阅QC76605以取得更多信息。以及下列更新。
示例:
所提供的解决方法如下所示:
但正如所评论的,这将挫败泛型的整个想法,因为类必须为每个泛型示例化子类化。
下面还有一个链接,指向生成泛型类型的专用子类的类似解决方法:derive-from-specialized-generic-types。在本例中,它将如下所示:
更新日期:
RM提议的解决方法:
可以使用以下方案实现类型安全:
第一个
当创建泛型类时,进行测试以检查所创建的类是从单元B中声明的类型派生的。由此,检测到从单元a创建该类的所有尝试。
更新2:
需要说明的是,对泛型类“
class of type<T>
“的引用是不可能的,但泛型类的副本是可以的。iqxoj9l92#
因为不可能为泛型类声明“类型别名”,所以这里有一个使用interface的解决方案。
第一个
gjmwrych3#
TMyC = T的阵列;
TMyD = TMyC<...integer...>;
步骤X;
变量
t4:TMyD;
开始
t4:= [1];
对于变量i:整数:=低(t4)至高(t4)do
(t4[i].ToString);
结束;