[英]Can it make sense to call one overloaded constructor from another?
如果我有兩個重載的構造函數,一個不帶參數,另一個帶參數:
constructor Create; overload;
constructor Create(Param: TObject); overload;
如果我想運行第一個中的代碼,在第二個中調用它是否有意義? 並繼承為先調用父構造函數?
constructor TMyType.Create(Param: TObject);
begin
inherited Create;
Create;
FParam := Param;
end;
謝謝!
如果我想運行第一個中的代碼,在第二個中調用它是否有意義, 並且繼承也要首先調用父構造函數?
不會。因為您的第一個構造函數應該調用繼承的自身,所以最終繼承的構造函數將被調用兩次,這很可能是您所不希望的。
否則,如果您的無參數TMyType.Create()
不調用繼承的對象,則它幾乎不是一個正確的構造函數,應將其刪除。
所以正確的方法是這樣的:
constructor TMyType.Create(Param: TObject); overload;
begin
Create();
FParam := Param;
end;
constructor TMyType.Create(); overload;
begin
inherited Create(); // for both constructors
...some common code
end;
但是在德爾福,還有另一種可能性。
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;
但是要注意區別,什么時候執行“通用代碼”,什么時候執行“ FParam:= Param;”。
在第一種方式中,流程將像
在第二個順序將有所不同
如您所見,這些塊的執行順序相反。
但是,也許您根本不需要多個構造函數?
constructor TMyType.Create(const Param: TObject = nil);
begin
inherited;
... Some code
FParam := Param;
end;
是的,您的代碼很合理,構造函數的調用完全可以實現預期的效果。
Delphi對象模型支持調用繼承的構造函數的構造函數和不調用繼承的構造函數。
如果不確定,請嘗試以下操作:
program Project5;
{$APPTYPE CONSOLE}
uses
SysUtils;
type
TMyBase = class
constructor Create;
end;
TMyType = class(TMyBase)
constructor Create; overload;
constructor Create(Param: TObject); overload;
end;
constructor TMyBase.Create;
begin
Writeln('TMyBase.Create');
end;
constructor TMyType.Create;
begin
Writeln('TMyType.Create');
end;
constructor TMyType.Create(Param: TObject);
begin
inherited Create;
Create;
Writeln('TMyType.Create(Param)');
end;
begin
TMyType.Create(TObject.Create);
Readln;
end.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.