使用下面的结构,如何定义我的TAnimalCollection类以存储我的集合?调用SelectAll或SelectTop10将更新SelectedRecords。删除私有字段允许编译代码,但是没有机制来存储返回的结果集。
TDog = class
private
FBreed: string;
public
property Breed: string read FBreed write FBreed;
end;
TCat = class
private
IsWild: string;
public
property IsWild: string read FIsWild write FIsWild;
end;
TMyArray<T> = array of T;
TAnimalCollection = class
private
SelectedRecords: TMyArray<T>; // Generates: Undeclared Identifier: 'T'
public
function SelectAll<T>: TMyArray<T>;
function SelectTop10<T>: TMyArray<T>;
// Other Methods
end;发布于 2012-06-06 04:45:52
首先,您不需要TMyArray;内置的TArray类型也是如此。
不过,编译器是正确的。在您的字段声明中,没有像T这样的东西。泛型参数需要在声明的左边引入,然后才能在右边使用。如果支持泛型字段,则声明如下所示:
SelectedRecords<T>: TArray<T>;,但它不是,在这种情况下,您也不会希望它这样做。显然,您希望将两个完全不相关的类同时存储在同一个数组中。数组总是一种类型。唯一统一TDog和TCat的类型是TObject,因此您的数组必须是该类型的:
SelectedRecords: TArray<TObject>;
// or, more conventionally,
SelectedRecords: array of TObject;欢迎您声明一个“泛型数组”,但只作为泛型类的字段或泛型方法的变量。如果可以声明独立的泛型数组,请考虑何时确定数组元素的实际类型。如果不是在声明数组的点,那么什么时候?使用类和方法,在声明类的变量、实例化类或调用方法时,可以指定类型参数。这些用途与它们的声明是分开的,而且每种用途都是不同的。当您声明一个变量时,您必须以声明它的方式使用它--如果不重新编译程序,变量的类型就不能改变。
https://stackoverflow.com/questions/10907555
复制相似问题