gpt4 book ai didi

delphi - 如何避免通用容器中的非无参数构造函数出现不兼容的类型错误?

转载 作者:行者123 更新时间:2023-12-02 08:27:56 25 4
gpt4 key购买 nike

我在以下代码中得到E2010 Incompromed types: 'TDerivedFrame' and 'TBaseFrame':

type
TBaseFrame = class(TFrame)
end;

TDerivedFrame = class(TBaseFrame)
end;

TContainer<T: TBaseFrame> = class
private
FFrame: T;
public
property Frame: T read FFrame;
constructor Create;
end;

constructor TContainer<T>.Create;
begin
inherited;
FFrame := TBaseFrame(T).Create(nil);
end;

var
FTab: TContainer<TDerivedFrame>;

仅使用 T.Create(nil) 会导致 E2568 无法在类型参数声明中没有 CONSTRUCTOR 约束的情况下创建新实例

据我所知,您只能使用无参数构造函数创建构造函数约束。

正确的做法是什么?

PS:当我删除变量时代码会编译,这让我认为这是编译器错误?!

编辑:我理解 E2010 错误,但即使使用 T(TBaseFrame(T).Create(nil)) 它也不起作用。这可以编译,但会在运行时导致访问冲突:

type
TBaseFrame = class(TFrame)
public
constructor Create(AOwner: TComponent); override;
end;

TDerivedFrame = class(TBaseFrame)
public
constructor Create(AOwner: TComponent); override;
end;

TContainer<T: TBaseFrame> = class
private
FFrame: T;
public
property Frame: T read FFrame;
constructor Create;
end;


constructor TBaseFrame.Create(AOwner: TComponent);
begin
inherited;

end;

constructor TDerivedFrame.Create(AOwner: TComponent);
begin
inherited;

end;

constructor TContainer<T>.Create;
begin
inherited;
FFrame := T(TBaseFrame(T).Create(nil));
end;

var
FTab: TContainer<TDerivedFrame>;
begin
FTab := TContainer<TDerivedFrame>.Create;
end.

最佳答案

FFrame := T(TBaseFrameClass(T).Create(nil));

是执行此操作的正确方法。

你需要

type 
TBaseFrameClass = class of TBaseFrame;

您的编译器错误是因为您实例化类型,TContainer<TDerivedFrame> 。当您实例化该类型时,您要求编译器处理

FFrame := TBaseFrame(...);

哪里FFrameTDerivedFrame 。如果您在没有泛型的情况下编写该代码,您就会理解编译器错误。

因此,编译器在这里表现正确,但实例化问题让您感到困惑。只有在实例化时,编译器错误才会变得明显。没有实例化,如果你已经实例化了 TContainer<TBaseFrame>不会有编译器错误。

AV是因为你在选角T成为一个实例而不是一个类。

关于delphi - 如何避免通用容器中的非无参数构造函数出现不兼容的类型错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13342572/

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