use*_*191 16 delphi generics inheritance
我尝试继承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;
Run Code Online (Sandbox Code Playgroud)
通过这种结构,我在向LVRvars添加键/值对时获得AV.最终我发现可以通过将继承类的构造函数更改为可以防止这种情况
constructor TLVRvars.create;
begin
inherited create;
end;
Run Code Online (Sandbox Code Playgroud)
我不明白为什么要这样做.虽然我的问题已经解决,但我仍然想知道.
Dav*_*nan 21
在你的构造函数中
inherited;
Run Code Online (Sandbox Code Playgroud)
使用与构造函数相同的参数列表调用构造函数.你的构造函数没有参数,因此inherited调用了do nothing constructor TObject.您不仅丢失了比较器,而且您的实例缺少构造中的其余必要步骤.
当你用它替换它
inherited Create;
Run Code Online (Sandbox Code Playgroud)
而编译器则执行正常的方法解析.它查找类祖先列表并调用它可以的第一个方法.在这种情况下,这是:
constructor Create(ACapacity: Integer = 0); overload;
Run Code Online (Sandbox Code Playgroud)
因此,您的实例已正确创建.
文档在这里:http://docwiki.embarcadero.com/RADStudio/en/Methods#Inherited
主要摘录如下:
如果继承后跟成员名称,则表示正常的方法调用
和
当继承后面没有标识符时,它引用与封闭方法同名的继承方法,或者如果封闭方法是消息处理程序,则引用同一消息的继承消息处理程序.在这种情况下,inherited不使用显式参数,而是将与调用封闭方法相同的参数传递给inherited方法.例如:
Run Code Online (Sandbox Code Playgroud)inherited;在构造函数的实现中经常发生.它使用传递给后代的相同参数调用继承的构造函数.
这很奇怪不是吗.从表面上看,调用不同的方法似乎令人惊讶.关键的一点是,plain inherited会导致参数列表的精确匹配.而且你的方法没有参数.
另一方面inherited Create是标准方法调用.在后一种情况下,您最终使用一个参数调用方法,使用该参数的默认值.因此,虽然看起来你正在调用无参数构造函数,但事实并非如此.您正在传递一个参数ACapacity,和值0.