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

时间:2017-08-11 17:43:01

标签: delphi generics

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

  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类型参数&#39; T&#39;必须有一个名为Create

的公共无参数构造函数

问题是什么,我该如何解决?

1 个答案:

答案 0 :(得分:4)

错误意味着编译器无法确定T是否满足要求。像这样声明派生类

TMyBaseClassReader<T: TMyBaseClass, constructor>