Delphi Tdictionary继承

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方法.例如:

inherited;
Run Code Online (Sandbox Code Playgroud)

在构造函数的实现中经常发生.它使用传递给后代的相同参数调用继承的构造函数.

这很奇怪不是吗.从表面上看,调用不同的方法似乎令人惊讶.关键的一点是,plain inherited会导致参数列表的精确匹配.而且你的方法没有参数.

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

  • 突出显示默认参数的危险.在这种情况下,看起来完全等效的代码:`inherited;`(最后)调用默认的无参数ctor**创建**vs`继承Create;`***显式调用继承的无参数ctor**Create**但实际上解析为具有*default*参数的ctor.接得好. (3认同)