コンストラクタやデストラクタの動作を希望どうりにさせるには?


鉄棒ができない  2008-08-27 20:58:17  No: 31690

基本的なことで申し訳ありませんが
よろしくお願いします。

A = class(TPersistent)
pubclic
  constructor Create;
end;

B = class(A)
pubclic
  constructor Create;
end;

C = class(B)
pubclic
  constructor Create(S: Integer);
end;

この場合
  Aのクリエイト
  Bのクリエイト
  Cのクリエイト
の順で実行されますね。

次に、Cのコンストラクタ宣言で
  constructor Create(S: Integer); override;
とすると、
  Cのクリエイト
だけが実行されるんですよね
そして、この場合に

constructor C.Create(S: Integer);
begin
  inherited Create;
end;

とすると
  A,B,Cのクリエイトが実行される

ということでいいのでしょうか?


ofZ  2008-08-28 00:52:58  No: 31691

> とすると
>  A,B,Cのクリエイトが実行される
結果的にはそうですが、Helpにも書いてあると思うけど、inherited は、
継承元のメソッドを呼び出すもの。

constructor B.Create;
begin
end;

Bのコンストラクタが上記のように記述なしならば、Aのクリエイトは実行されません。

という回答でよいのかしら?


monaa  2008-08-28 01:01:29  No: 31692

簡単なことなんですから、テストすりゃいいじゃないですか。

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  A = class(TPersistent)
  public
    constructor Create;
  end;

  B = class(A)
  public
    constructor Create;
  end;

  C = class(B)
  public
    constructor Create(S: Integer);
  end;

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
{ A }

constructor A.Create;
begin
  ShowMessage('A');
end;

{ B }

constructor B.Create;
begin
  // inherited Create;
  ShowMessage('B');
end;

{ C }

constructor C.Create(S: Integer);
begin
  // inherited Create;
  // A.Create;
  // B.Create;
  ShowMessage('C');
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  C1:C;
begin
  C1:=C.Create(1);
  C1.Free;
end;

end.


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加