Delphi 德尔菲词典继承

Delphi 德尔菲词典继承,delphi,generics,inheritance,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;

我试图从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;

我不明白我为什么要那样做。虽然我的问题已经解决了,但我仍然想知道。

比较器是一个需要自己创建的对象。如果您的子类中没有构造函数,我希望创建默认构造函数,因为您将隐式调用继承的构造函数。如果您创建自己的构造函数,您应该始终调用继承的create(在我看来),以允许祖先执行其工作-在本例中,创建默认的比较器。

在您的构造函数中

 inherited;
使用相同的参数列表调用构造函数。您的构造函数没有参数,因此
inherited
TObject
中调用不做任何事情的构造函数。您不仅丢失了比较器,而且实例也丢失了构建过程中其他必要的步骤

当你将其替换为

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

constructor Create(ACapacity: Integer = 0); overload;
因此,您的实例是正确创建的

文件如下:

主要摘录如下:

如果inherited后跟成员的名称,则表示正常的方法调用

当inherited后面没有标识符时,它指的是继承的 与封闭方法同名的方法,或者 方法是一个消息处理程序,与 同样的信息。在这种情况下,inherited不接受显式参数, 但是向继承的方法传递与 调用了封闭方法。例如:

inherited;
在构造函数的实现中经常发生。它称之为 继承的构造函数,其参数与传递给 后代

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


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

以前是否有构造函数?突出显示默认参数的危险。在本例中,看起来完全相同的代码:
inherited(结束)调用默认的无参数ctor Create vs
继承的Create
似乎显式调用继承的无参数ctor Create,但实际上解析为具有默认参数的ctor。抢手货
inherited;