泛型:什么是"构造函数约束"?

Mas*_*ler 9 delphi generics constructor delphi-2009

我创建了一个自定义TObjectList后代,用于保存基础对象类的子类.它看起来像这样:

interface
   TMyDataList<T: TBaseDatafile> = class(TObjectList<TBaseDatafile>)
   public
      constructor Create;
      procedure upload(db: TDataSet);
   end;

implementation

constructor TMyDataList<T>.Create;
begin
   inherited Create(true);
   self.Add(T.Create);
end;
Run Code Online (Sandbox Code Playgroud)

我希望每个新列表都以一个空白对象开头.这很简单,对吧?但编译器不喜欢它.它说:

"无法在类型参数声明中创建没有CONSTRUCTOR约束的新实例"我只能假设这是与泛型相关的东西.任何人都知道发生了什么以及如何使这个构造函数工作?

Kon*_*lph 17

您正在尝试创建Tvia 的实例T.Create.这不起作用,因为编译器不知道您的泛型类型具有无参数构造函数(请记住:这不是必需的).要纠正这个问题,你必须创建一个构造函数约束,如下所示:

<T: constructor>
Run Code Online (Sandbox Code Playgroud)

或者,在您的具体情况下:

<T: TBaseDatafile, constructor>
Run Code Online (Sandbox Code Playgroud)

  • 呸.在这种情况下,编译器*确实知道TBaseDataFile有一个不带参数的虚构造函数. (4认同)