14.3 泛型约束
正如我们所看到的,您在泛型类的方法中可以做的事情非常少。您可以传递它(即分配它)并执行上面我介绍的泛型类型函数允许的有限操作。
为了能够执行泛型类的实际操作,通常需要对其进行约束。例如,如果将泛型类型限制为类,则编译器将允许您在其上调用所有TObject
方法。您还可以进一步限制类为给定层次结构的一部分,或实现特定接口,从而可以在泛型类型的实例上调用类或接口方法。
14.3.1 类约束
您可以采用的最简单的约束是类约束。要使用它,您可以声明一个泛型类型,如下所示:
type
TSampleClass<T: class> = class
通过指定类约束,您表明只能将对象类型用作泛型类型。使用以下声明(取自ClassConstraint
示例):
type
TSampleClass<T: class> = class
private
FData: T;
public
procedure One;
function ReadT: T;
procedure SetT(T1: T);
end;
您可以创建前两个实例,但不能创建第三个实例:
Sample1: TSampleClass<TButton>;
Sample2: