Delphi 如何使用构造函数约束定义泛型列表类型的参数?

Delphi 如何使用构造函数约束定义泛型列表类型的参数?,delphi,generics,Delphi,Generics,我想定义三个基类:保存数据的TMyBaseClass、保存TMyBaseClass实例列表的TMyBaseClassList和滚动数据集并填充TMyBaseClassList对象的TMyBaseClassReader。这是我的代码: TMyBaseClass = class public // properties constructor Create; end; TMyBaseClassList<T: TMyBaseClass, constructor&

我想定义三个基类:保存数据的TMyBaseClass、保存TMyBaseClass实例列表的TMyBaseClassList和滚动数据集并填充TMyBaseClassList对象的TMyBaseClassReader。这是我的代码:

  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对不起,那是我原始代码中留下的。