我制作了一个自定义的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;

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

“无法在类型参数声明中没有CONSTRUCTOR约束的情况下创建新实例”
我只能假设这与泛型相关。任何人都知道发生了什么事以及如何使此构造函数起作用?

最佳答案

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

<T: constructor>

或者,在您的特定情况下:
<T: TBaseDatafile, constructor>

关于delphi - 泛型:什么是 "CONSTRUCTOR constraint"?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/383689/

10-10 07:35