問題

createで継承されたメンバーフィールドを呼び出す前にメンバーフィールドを初期化するのは大丈夫ですか?

すなわち:

 constructor TMyObject.create(AOwner: TComponent);
begin
  fMyField := xxx;
  inherited
end;
 

通常の方法ではなく:

 constructor TMyObject.create(AOwner: TComponent);
begin
  inherited
  fMyField := xxx;
end;
 

ちょうど彼らの欠点は私が見なかったことです...

  ベストアンサー

クラスのインスタンスがインスタンス化されると、メモリが割り当てられ、デフォルトで初期化され(例えば0で埋められた)、コンストラクタが呼び出されます。したがって、コンストラクタ内のコードは、デフォルトの初期化後に実行されます。これは、あなたがやっていることを想像する1つのタイミングの問題です。

しかし、あなたのようなコードは通常、より深いデザインマレーズを示しています。継承されたコンストラクタを呼び出す前に値を初期化したかどうかはどのように重要でしょうか?これをどこでやりたいのか想像できる理由は2つあります。

  1. 問題のフィールドが派生クラスで宣言されている場合、祖先コードがアクセスできる唯一の方法は、仮想(または動的)メソッドを呼び出すことです。そして、コンストラクタでこれを行うことは、オブジェクトが部分的にしか作成されないため危険です。それは大きな有毒なコードの匂いです。

  2. 問題のフィールドが祖先クラスで宣言されている場合、このメカニズムを使用して派生クラスから祖先への引数を渡す可能性があります。それはそれを行うかなり奇妙な方法です。より適切な方法は、コンストラクタで引数を使用することです。

  同じタグがついた質問を見る

delphi