delphi – 创建自定义构造函数而不直接调用inherited
如果在我的自定义构造函数中我不直接调用继承但是我调用’普通’构造函数,这没关系吗?
TContainer = Class(TNGContainer) private FEncoding: TMyEncoding; protected public constructor Create; overload; override; constructor Create(Enc: TMyEncoding); overload; end; constructor TContainer.Create; { 'normal' constructor } begin inherited Create; Clear; BufMaxSeqLen := 8*KB; FEncodingOffset := 33; {More stuff to initialize here...} end; constructor TContainer.Create(Enc: TMyEncoding); { New constructor } begin Create; { Call 'normal' constructor which will call Inherited } Encoding:= Enc; end; 我可以在第二个构造函数中调用inherited,但第一个构造函数有很多初始化代码.所以,我必须在两个构造函数中复制此代码.在一个构造函数中修改初始化代码很容易,而忘记在另一个构造函数中执行相同的操作. 我逐行运行代码,并以正确的顺序调用构造函数.正确调用继承的(父)构造函数. Pieter B的评论让我问这个“总结”的问题:是什么让构造函数成为构造函数? 解决方法
是的,这是完全可以接受的.事实上,在这种情况下,在新的构造函数中调用继承的Create会很糟糕,并且会让您面临子类的重写构造函数在它们应该被调用时没有被调用的风险.
假设一个层次结构:TSubContainer = class(TContainer)= class(TNGContainer): 正如您编写的那样(这是正确的),当您的新构造函数被调用时,步骤的顺序如下: > TContainer.Create(Enc:TMyEncoding); 如果您改为调用继承的Create,则步骤顺序如下: > TContainer.Create(Enc:TMyEncoding); 请注意,应该在TSubContainer.Create中完成的任何工作;和TContainer.Create;不会发生. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |