3

使用下面的结构,我如何定义我的 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;
4

1 回答 1

6

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

不过编译器是正确的。在您的字段声明中,没有T. 泛型参数需要在声明的左侧引入,然后才能在右侧使用。如果 Delphi 支持通用字段,则声明将如下所示:

SelectedRecords<T>: TArray<T>;

但它没有,而且在这种情况下你也不希望它出现。您显然希望将两个完全不相关的类同时存储在同一个数组中。数组始终是单一类型。唯一统一TDog和的单一类型TCatTObject,因此您的数组需要属于该类型:

SelectedRecords: TArray<TObject>;
// or, more conventionally,
SelectedRecords: array of TObject;

欢迎您声明“泛型数组”,但只能作为泛型类的字段或泛型方法的变量。如果您可以声明一个独立的泛型数组,请尝试考虑何时确定数组元素的实际类型。如果不是在你声明数组的时候,那么什么时候?使用类和方法,您可以在声明类的变量、实例化类或调用方法时指定类型参数。这些是与其声明分开的用途,并且每种用途都是不同的。当你声明一个变量时,你必须以你声明它的方式使用它——一个变量的类型不能在不重新编译程序的情况下改变。

于 2012-06-06T04:45:52.517 回答