gpt4 book ai didi

delphi - 没有无参数构造函数的泛型

转载 作者:行者123 更新时间:2023-12-03 15:51:30 27 4
gpt4 key购买 nike

有人可以解释为什么在下面的代码中,class1List要求class1有一个无参数构造函数,但class2list确实要求类2有一个无参数构造函数。

unit Unit11;

interface

uses
System.Generics.Collections;

type
class1 = class
public
constructor Create( const i : integer ); virtual;
end;

class1List<T : class1 > = class( TObjectList< T > )
public
function AddChild( const i : integer ) : T;
end;

class2 = class
public
constructor Create( const i : integer );
end;

class2List<T : class2 > = class( TObjectList< T > )
public
function AddChild( const i : integer ) : T;
end;


implementation

{ class1List<T> }

function class1List<T>.AddChild(const i: integer): T;
begin
Result := T.Create( i );
inherited Add( Result );
end;

{ class2List<T> }

function class2List<T>.AddChild(const i: integer): T;
begin
Result := T.Create( i );
inherited Add( Result );
end;

{ class1 }

constructor class1.Create(const i: integer);
begin

end;

{ class2 }

constructor class2.Create(const i: integer);
begin

end;

end.

最佳答案

function class1List<T>.AddChild(const i: integer): T;
begin
Result := T.Create( i );
inherited Add( Result );
end;

class1 的构造函数被声明为virtual。因此,编译器知道 T.Create 生成一个 T 的实例,其预期的构造函数已被调用。因此编译器接受此代码。请注意,早期版本的编译器会拒绝此代码并强制您使用以下转换

Result := T(class1(T).Create( i ));

但是最新版本的编译器已经不再需要这种欺骗了。

<小时/>
function class2List<T>.AddChild(const i: integer): T;
begin
Result := T.Create( i );
inherited Add( Result );
end;

class2 的构造函数不是 virtual,因此编译器知道如果调用 class2 的构造函数,该类可能会未正确初始化。它准备从专用类型 T 调用无参数构造函数(如果存在),并且在声明泛型类型时应用构造函数 约束。但是,该语言无法为接受参数的构造函数应用构造函数约束。

现在,您可以应用构造函数约束,但这没有任何好处。为了正确初始化实例,您需要使用参数调用构造函数。实际上,这意味着您应该使用第一种使用虚拟构造函数的方法。

不要试图摆脱困境。该代码将编译

Result := T(class2(T).Create( i ));

但可能不会做你想做的事。这将调用 class2 的静态构造函数,这肯定不是您想要的。

关于delphi - 没有无参数构造函数的泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44945217/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com