我在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
我该怎么设置呢?
答案 0 :(得分:3)
构造函数需要一个具体的实例化,一个实例:
TSystemBaseList<TSystemColumnEntity>
您正在提供类型为
的未实例化通用实例TSystemBaseList<T>
您必须为该构造函数提供具体实例。在当前形式中,您无法从TSystemBaseList<T>.Execute
实例化表单。
您可能会认为,因为T
必须来自TSystemColumnEntity
TSystemBaseList<T>
与TSystemBaseList<TSystemColumnEntity>
兼容。但事实并非如此,因为不支持通用差异。在此处阅读有关此主题的更多信息:Generics and variance。
前进的方法之一是使表单类型通用。虽然这与IDE表单设计器不兼容。我怀疑需要更彻底的重新设计来解决你的问题。我没有就重新设计提出建议,因为我不知道这个问题。