「明白な」有用な、またはDelphiオブジェクトの作成と破棄について

OOPメカニズムの特定の実装について読むとき、特定の言語またはライブラリの特定の機能が「自明」と呼ばれる方法を見るのは非常に面白いです。 C ++でのOOPの記述は、この点で特に注目に値します。実際、実装は最も不透明でわかりにくいものの1つです。

したがって、証拠については何も書きませんが、オブジェクトのライフサイクルの重要なポイントで、DelphiでのOOPの実装の「明らかな」ではなく非常に便利な機能を使用して、人生を楽にする方法についてお話します。





コンストラクターでオブジェクトの作成を完了することができない場合の処理



デザイナーがデータをオブジェクトのフィールドにのみ保存する場合、ソリューションは基本的です-例外を発生させるのに十分です。 RTL Delphi自体がそれをインターセプトし、デストラクタを呼び出し、使用済みメモリを解放し、再び例外をスローします。

したがって、構築用のデータの一部がグローバル変数に格納されている場合、通常のtry..exceptブロックを使用して、例外を繰り返し発生させるだけで十分です。

これからデストラクタの2つの要件が推測されます:例外を引き起こさない、つまりリソー​​スの解放(設定の保存など)以外のことをしようとしないことを意味します...



部分的に初期化されたオブジェクトの削除



Delphiでは、コントロールがコンストラクターに転送される前であっても、オブジェクトはゼロに初期化されるため、これにより問題が生じることはありません。 したがって、デストラクタでは、null値を正しく処理するだけで十分です。FreeAndNilプロシージャは、オブジェクトへの参照がnilでなくなった場合にのみオブジェクトを解放します。



コンストラクターの呼び出し順序



Delphiでは、問題ではありません。 先祖のコンストラクタ、同じクラスの他のコンストラクタを通常のメソッドと同じ方法で呼び出すか、何も呼び出さないことができます-したがって、祖先の初期化を使用する必要がある場合、呼び出すことを忘れないことをお勧めしますが、コンストラクタを呼び出す前または呼び出す代わりに何かする必要があります先祖はありません。



コンストラクターで仮想メソッドを呼び出す



Delphiでは、オブジェクトはすぐにVMTへの最終参照で初期化されるため、他のオプションのコンストラクターから仮想メソッドを呼び出す間に違いはありません。



仮想コンストラクターとクラス参照



Delphiでは、コンストラクターを仮想にすることができます。 この機能の意味は、ファクトリを実装する必要なく、コンパイル段階で未知のクラスを持つオブジェクトを作成する機能です。 この目的のために、(オブジェクトではなく)クラスへの参照を持つ変数が使用されます。リンクの値に応じて、対応するクラスまたはその子孫のインスタンスを取得することにより、仮想コンストラクタを呼び出すことができます。



オブジェクトの存続期間の自動制御



オブジェクトが明示的に定義された1つまたは別のインターフェイスを実装している場合、割り当てまたは操作asを使用して、このインターフェイスへのリンクに移動できます。 この場合、Delphi自体がIUnknownメソッド呼び出しを生成するため、インターフェイスを要求したり、オブジェクトを明示的に削除したりすることはできません。



まとめ



一方では、上記のすべてがすべての開発者に知られている必要があります。 一方で、自転車を発明した経験豊富なプログラマーに会ったのは、作業ツールの実装の詳細を知らなかったからです。 この記事が少しお役に立てば幸いです。 DelphiのOOP実装の便利な機能のうち、インターフェイスの実装の委任のサポートは未検討のままですが、これは別の記事のトピックです。




All Articles