Delphi 如何使用构造函数约束定义泛型列表类型的参数?
我想定义三个基类:保存数据的TMyBaseClass、保存TMyBaseClass实例列表的TMyBaseClassList和滚动数据集并填充TMyBaseClassList对象的TMyBaseClassReader。这是我的代码:Delphi 如何使用构造函数约束定义泛型列表类型的参数?,delphi,generics,Delphi,Generics,我想定义三个基类:保存数据的TMyBaseClass、保存TMyBaseClass实例列表的TMyBaseClassList和滚动数据集并填充TMyBaseClassList对象的TMyBaseClassReader。这是我的代码: TMyBaseClass = class public // properties constructor Create; end; TMyBaseClassList<T: TMyBaseClass, constructor&
TMyBaseClass = class
public
// properties
constructor Create;
end;
TMyBaseClassList<T: TMyBaseClass, constructor> = class(TObjectList<TMyBaseClass>)
public
function AddNew: T;
end;
TMyBaseClassReader<T: TMyBaseClass> = class
public
class procedure ReadProperties(const DataSet: TCustomADODataSet;
const Item: T); virtual; abstract;
class procedure ReadDataSet(const DataSet: TCustomADODataSet;
const List: TMyBaseClassList<T>);// <- E2513
end;
...
constructor TMyBaseClass.Create;
begin
inherited;
end;
function TMyBaseClassList<T>.AddNew: T;
begin
Result := T.Create;
Add(Result);
end;
class procedure TMyBaseClassReader<T>.ReadDataSet;
var
NewItem: T;
begin
while not DataSet.Eof do
begin
NewItem := List.AddNew;
ReadProperties(DataSet, NewItem);
DataSet.Next;
end;
end;
然后我想派生子类并只实现ReadProperties方法。但我得到了一个E2513错误:
E2513类型参数“T”必须有一个名为Create的公共无参数构造函数
问题是什么?我如何修复它?该错误意味着编译器无法确保T满足要求。像这样声明派生类
TMyBaseClassReader<T: TMyBaseClass, constructor>
该错误意味着编译器无法确保T满足要求。像这样声明派生类
TMyBaseClassReader<T: TMyBaseClass, constructor>
为什么要使用类抽象?你认为这能实现什么?@DavidHeffernan你是说ReadProperties?我想在TMyBaseClassReader中重写它,然后我不会在所有子类中复制ReadDataSet的逻辑wrote@DavidHeffernan很抱歉,这是我原始代码中留下的。为什么要使用类抽象?你认为这能实现什么?@DavidHeffernan你是说ReadProperties?我想在TMyBaseClassReader中重写它,然后我不会在所有子类中复制ReadDataSet的逻辑wrote@DavidHeffernan对不起,那是我原始代码中留下的。