簡體   English   中英

從另一個調用一個重載的構造函數是否有意義?

[英]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;”。

在第一種方式中,流程將像

  • 創建(Param)
  • ..創造()
  • .... Inherited Create()
  • .... 通用代碼
  • .. FParam:=參數;
  • AfterConstruction(空)

在第二個順序將有所不同

  • 創建(Param)或創建()
  • ..Inherited Create()
  • .. FParam:=參數;
  • 施工后
  • .. 通用代碼

如您所見,這些塊的執行順序相反。


但是,也許您根本不需要多個構造函數?

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM