8

デストラクタで継承された呼び出しの後にコードを実行することは、Delphi で本当に問題ないのでしょうか?

これは System.Classes にあります。

destructor TThread.Destroy;
begin
[...]
  inherited Destroy;
  FFatalException.Free;
end;

継承された Destroy メソッドを呼び出した後にインスタンス メンバーにアクセスするのは悪い考えだと思います。

4

2 に答える 2

9

継承されたデストラクタによって破棄されたものにコードが依存しない限り、継承されたデストラクタの呼び出しにコードを実行することは完全に安全です。同様に、継承されたコンストラクターでインスタンス化されたものにコードが依存しない限り、継承されたコンストラクターへの呼び出しの前にコードを実行しても安全です。

しかし、これが良いスタイルでないことは確かです。場合によっては、そのようなコードにつながる理由もありますが、通常、そのような理由は、設計に問題があることを示していると見なす必要があります。

あなたが与える例では、そのようにコードを書く必要はありません。FFatalException.Freeへの呼び出しは、継承されたデストラクタへの呼び出しの前に完全に発生する可能性があります。

于 2013-06-25T12:18:40.700 に答える
5

インスタンスは、デストラクタ メソッド自体によってではなく、の呼び出しによってメモリから削除されます。TObject.FreeInstance

TObject.FreeInstanceデストラクタ コードの処理後にデストラクタが呼び出されるため、が呼び出されます。

ところで:コンストラクターと同じです。インスタンスはによって作成され、コンストラクターが呼び出さclass function TObject.NewInstance : TObjectれるに呼び出されます(コンストラクターであるという理由だけで)

このため、コンストラクターまたはデストラクター コード全体の中に有効なインスタンスが存在します。

于 2013-06-25T13:25:21.070 に答える