gpt4 book ai didi

Delphi T字典继承

转载 作者:行者123 更新时间:2023-12-03 14:35:57 24 4
gpt4 key购买 nike

我尝试从 Tdictionary 继承,但不知何故默认比较器丢失了。这就是我本质上所做的:

type
TinpVar = class
end;
TinputVars = class(Tdictionary<string,TinpVar>)
end;
TLVRvars = class(TinputVars)
constructor create;
end;

constructor TLVRvars.create;
begin
inherited;
end;

var LVRvars : TLVRvars;

begin
LVRvars:=TLVRvars.create;

通过这种结构,我在向 LVRvars 添加键/值对时得到了 AV。最终我发现可以通过将继承类的构造函数更改为来防止这种情况

constructor TLVRvars.create;
begin
inherited create;
end;

我不明白为什么我必须这样做。虽然我的问题解决了,但我还是想知道。

最佳答案

在你的构造函数中

 inherited;

使用与构造函数相同的参数列表调用构造函数。您的构造函数没有参数,因此 inherited 调用 TObject 中的不执行任何操作的构造函数。您不仅丢失了比较器,而且您的实例还缺少构建中的其余必要步骤。

当你替换它时

inherited Create;

编译器改为执行正常的方法解析。它查找类祖先列表并调用它可以调用的第一个方法。在这种情况下,这是:

constructor Create(ACapacity: Integer = 0); overload;

因此您的实例已正确创建。

文档位于:http://docwiki.embarcadero.com/RADStudio/en/Methods#Inherited

主要摘录如下:

If inherited is followed by the name of a member, it represents a normal method call

When inherited has no identifier after it, it refers to the inherited method with the same name as the enclosing method or, if the enclosing method is a message handler, to the inherited message handler for the same message. In this case, inherited takes no explicit parameters, but passes to the inherited method the same parameters with which the enclosing method was called. For example:

inherited;

occurs frequently in the implementation of constructors. It calls the inherited constructor with the same parameters that were passed to the descendant.

这很奇怪不是吗?从表面上看,调用不同的方法似乎令人惊讶。但关键点是,简单的继承会导致参数列表的精确匹配。并且您的方法没有参数。

另一方面,继承的Create是标准方法调用。在后一种情况下,您最终会调用带有一个参数的方法,并使用该参数的默认值。因此,虽然看起来您正在调用无参数构造函数,但实际上并非如此。您正在传递一个参数 ACapacity 和一个值 0

关于Delphi T字典继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40492756/

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