如果我想要第一个代码运行,是否有意义在第二个里面调用它并且继承也首先调用父级构造函数?
不。因为你的第一个构造函数应该自己调用继承的那个,因此最终继承的构造函数将被调用两次,这可能是不期望的。
否则,如果您的无参不调用继承的那个,则它几乎不是一个合适的构造函数,应该被删除。
因此正确的方法应该是这样的:
constructor TMyType.Create(Param: TObject); overload;
begin
Create();
FParam := Param;
end;
constructor TMyType.Create(); overload;
begin
inherited Create();
...some common code
end;
然而,在Delphi中还有另一种可能性。
constructor Create; overload;
constructor Create(Param: TObject); overload;
procedure AfterConstruction; override;
constructor TMyType.Create(Param: TObject);
begin
inherited Create();
FParam := Param;
end;
constructor TMyType.Create();
begin
inherited ;
... maybe some extra code
end;
procedure TMyType.AfterConstruction();
begin
inherited;
...some common code
end;
请注意,"common code" 何时执行以及何时执行 "FParam := Param;"。
在第一种方式中,流程如下:
- 创建(Param)
- ..Create()
- ....Inherited Create()
- ....公共代码
- ..FParam := Param;
- AfterConstruction(空)
在第二个序列中,顺序会有所不同
- 创建(Param)或创建()
- ..Inherited Create()
- ..FParam := Param;
- AfterConstruction
- ..公共代码
正如您所看到的,这些块被执行的顺序被颠倒了。
也许你根本不需要多个构造函数?
constructor TMyType.Create(const Param: TObject = nil);
begin
inherited;
... Some code
FParam := Param;
end;