将带有Generic参数的类传递给Delphi中的另一个类

时间:2015-07-25 08:04:08

标签: delphi generics

我在Delphi XE5中有两个类,并将一个类传递给另一个:

  TfrmBaseList = class(TForm)
  private
    FListOwner: TSystemBaseList<TSystemColumnEntity>;
  public
    constructor Create(AListOwner: TSystemBaseList<TSystemColumnEntity>); virtual;
  end

  TSystemBaseList<T: TSystemColumnEntity> = class(TPersistent)
  public
    procedure Execute;
    property SelectedValues: TObjectList<T> read 
  end;


  procedure TSystemBaseList<T>.Execute;
  var
    frmList: TfrmBaseList;
  begin
   //frmList := TfrmBaseList.Create(Self<T>)
   //frmList := TfrmBaseList.Create(Self<TSystemColumnEntity>)  
   frmList := TfrmBaseList.Create(???????)
  end;

如何将 TSystemBaseList 传递给TfrmBaseList类的构造函数?

此构造函数仅创建一个Form,然后将AListOwner分配给FListOwner, 我可以将此构造函数更改为属性,如下所示:

TfrmBaseList = class(TForm)
private
  FListOwner: TSystemBaseList<TSystemColumnEntity>;
public
  property ListOwner: TSystemBaseList<TSystemColumnEntity> read FListOwner write FListOwner;
end

我该怎么设置呢?

1 个答案:

答案 0 :(得分:3)

构造函数需要一个具体的实例化,一个实例:

TSystemBaseList<TSystemColumnEntity>

您正在提供类型为

的未实例化通用实例
TSystemBaseList<T>

您必须为该构造函数提供具体实例。在当前形式中,您无法从TSystemBaseList<T>.Execute实例化表单。

您可能会认为,因为T必须来自TSystemColumnEntity TSystemBaseList<T>TSystemBaseList<TSystemColumnEntity>兼容。但事实并非如此,因为不支持通用差异。在此处阅读有关此主题的更多信息:Generics and variance

前进的方法之一是使表单类型通用。虽然这与IDE表单设计器不兼容。我怀疑需要更彻底的重新设计来解决你的问题。我没有就重新设计提出建议,因为我不知道这个问题。