8

Delphiのデストラクタは通常「Destroy」と名付けられていますが、私が理解している限り、あなたもできる

  • デストラクタに別の名前を付ける
  • 複数のデストラクタを持つ

これがこのように実装された理由はありますか?異なる名前/複数のデストラクタの使用例は何ですか?

4

1 に答える 1

8

理論的には、さまざまなデストラクタを手動で呼び出して、参照カウント ループの中断、ファイルの削除またはクローズなど、さまざまな外部リソースを解放することができます。

また、Object Pascal 言語には魔法のような新規作成/削除操作がないため、オブジェクトを破棄するために呼び出す識別子が必要です。

それを振り返ってみるといいと思います。

「Turbo Pascal with Objects」スタイルのオブジェクトには両方があります。「魔法の」Disposeプロシージャを呼び出しますが、呼び出すデストラクタを明示的に指定します。これは、言語自体が何を選択するかを認識していなかったためです。同様に、「魔法の」手順Newは、手動で選択されたコンストラクターで提供される必要がありました。

ただし、これは DRY 原則に違反しています。コンパイラは、d-tor または c-tor を呼び出していることを認識していますが、これらの "New" および "Dispose" 関数を追加で呼び出す必要があります。理論的には、メモリ割り当てと情報フィードを分離し、それらを任意に組み合わせるために提供された可能性があります。しかし、この機能が実際に広く使用されたとは思いません。

同じ設計が Apple Objective C で使用されているのは興味深いことです。最初にオブジェクトにメモリを割り当て、その後、その新しいインスタンスのコンストラクタを呼び出します: http://en.wikipedia.org/wiki/Objective-C#Instantiation

そのモデルが Delphi 用に合理化されたとき、物事をより単純化 (および統合) するための決定はほとんど行われませんでした。メモリの割り当て解除戦略は、呼び出しサイトではなく、クラス レベルに移行されました。これにより、「New」の呼び出しと名前付きコンストラクターの両方の冗長性が非常に対照的になりました。1つは落とさなければなりませんでした。

C++/C#/Java は、特別な言語レベルのキーワードを保持するために選択され、オーバーロードされた関数を使用してさまざまな c-tor を提供します。おそらくそれは、米国スタイルのコンピュータ言語に対応しています。

しかし、Pascal の核心には、冗長性と語彙の少なさという 2 つの考え方があります。おそらく、Scala のような他のヨーロッパの学校の言語で追跡できます。可能であれば、キーワードを言語自体から削除し、外部モジュール (プロジェクトに追加または削除できるライブラリ) に移動する必要があります。また、オーバーロードされた関数は言語にかなり後になって導入され、初期の好みは、2 つの異なる名前の (自己文書化された) 関数名を持つことでした。

この両方のアイデアにより、Delphi はおそらく「魔法の」手順を削除し、関数名を使用するだけで呼び出しサイトでのオブジェクトの作成/破棄を推測するようになりました。を呼び出すとMyVar.Destroy、コンパイラはの宣言を見て.Destroy、オブジェクトを削除していることを認識します。同様に、宣言TMyType.CreateXXX(YYY,ZZZ)された方法によるオブジェクトのインスタンス化であることがわかりますCreateXXX

C++ のように c-tor と d-tor を名前なしにするには、C++newdelete. そして、それには明確な利点はないようです。少なくとも個人的には、Delphi の方が好きです。

PS。そこに 1 つの仮定を追加する必要がありました。1995 年頃の実際の C++ 言語と Delphi 言語について話しているのです。それらは、ヒープ割り当てオブジェクトの手動メモリ制御のみを特徴とし、ガベージ コレクションも自動参照カウントもありませんでした。変数に nil/NULL ポインターを割り当てても、オブジェクトの破棄をトリガーできませんでした。

于 2013-11-12T11:25:55.650 に答える