使用下面的结构,如何定义我的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;
答案 0 :(得分:6)
首先,您不需要TMyArray
;内置的TArray
类型做同样的事情。
但编译器是正确的。在你的字段声明中,没有T
之类的东西。通用参数需要在声明的 left 中引入,然后才能在右侧使用。 如果Delphi支持通用字段,声明将如下所示:
SelectedRecords<T>: TArray<T>;
但它不会,无论如何你都不会想要它。您显然希望同时在同一个数组中将两个完全不相关的类存储在一起。数组始终是单一类型。统一TDog
和TCat
的唯一单一类型是TObject
,因此您的数组必须属于该类型:
SelectedRecords: TArray<TObject>;
// or, more conventionally,
SelectedRecords: array of TObject;
欢迎您声明“泛型数组”,但仅作为泛型类的字段或泛型方法的变量。如果您可以声明一个独立的通用数组,请尝试考虑何时确定数组元素的实际类型。如果不是你声明数组,那么什么时候?使用类和方法,在声明类的变量,实例化类或调用方法时指定类型参数。这些使用与声明分开,每次使用都是不同的。声明变量时,必须按照声明它的方式使用它 - 如果不重新编译程序,变量的类型就无法更改。