使用Delphi XE在类中存储通用数组

Phi*_*oux 3 delphi generics

使用下面的结构,如何定义我的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;
Run Code Online (Sandbox Code Playgroud)

Rob*_*edy 6

首先,你不需要TMyArray; 内置TArray类型做同样的事情.

但编译器是正确的.在你的现场声明中,没有这样的东西T.泛型参数需要在声明的左侧引入,然后才能在右侧使用.如果Delphi支持通用字段,声明将如下所示:

SelectedRecords<T>: TArray<T>;
Run Code Online (Sandbox Code Playgroud)

但事实并非如此,无论如何你都不会想要它.您显然希望同时在同一个数组中将两个完全不相关的类存储在一起.数组始终是单一类型.统一了唯一的单一类型TDogTCatTObject,让你的阵列需要是这种类型的:

SelectedRecords: TArray<TObject>;
// or, more conventionally,
SelectedRecords: array of TObject;
Run Code Online (Sandbox Code Playgroud)

您可以声明一个"泛型数组",但只能作为泛型类的字段或泛型方法的变量.如果您可以声明一个独立的通用数组,请尝试考虑何时确定数组元素的实际类型.如果不是你声明数组,那么什么时候?使用类和方法,在声明类的变量,实例化类或调用方法时指定类型参数.这些是与声明分开的用法,每次使用都是截然不同的.声明变量时,必须按照声明它的方式使用它 - 如果不重新编译程序,变量的类型就无法更改.