Delphi 德尔菲词典继承
我试图从Tdictionary继承,但不知何故,默认的比较器丢失了。这就是我的本质: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;
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;