仮想コンストラクタについては、いくつかのデザインパターンの実装に使用されていますが、仮想コンストラクタの必要性は理解できませんでした。では、仮想コンストラクタは何ですか?また、なぜそれらが本当に必要なのですか?仮想コンストラクタはどこで使用されていますか?
答えて
ほとんどのプログラミング言語afaikでは、仮想コンストラクタを見つけることができません。オブジェクトの作成後に実行時に評価される仮想メンバのオーバーライドですが、ほとんどの言語でインスタンスを構築するときに実際のクラスを知る必要があります。したがって、仮想コンストラクタはこれらの言語で意味をなさない。
.NETでは、リフレクションによって同様のソリューションを得ることができます。つまり、構築するオブジェクトを表すTypeクラスのインスタンスを通じてオブジェクトを構築できます。ジェネリックサポートでは、同様のことを達成することもできますが、仮想コンストラクタではありません。
本当の仮想コンストラクタを持っているプログラミング言語はDelphiだけです。 Delphiには、メタクラスを表す特定の「Metaclassタイプ」、つまり.NETのメタクラスであるType
クラスが、通常のクラスのインスタンスにすぎません。あなたはTMyClass
というクラス持っているのであれば - Deplhiの命名規則;)あなたは今、この
TMyMetaClass : class of TMyClass
のようなメタクラスを宣言することができます
TMyClass : Class ...
を、あなたは、TMyMetaClass
型である変数を宣言することができます
MyMetaClassVariable : TMyMetaClass
...
// Assign the meta class to refer to our concrete class
MyMetaClassVariable := TMyClass;
この変数を使用して新しいインスタンスを作成することができます。
MyClassInstance := MyMetaClassVariable.Create();
ここで、MyMetaClassVariable
は、TMyClass
またはその特殊化のいずれかのクラスを参照できます。コンストラクタが仮想宣言されている場合、変数はその特定のクラスのインスタンスで構築されます。
同様に、Delphiで仮想静的メソッドを宣言し、それらをメタクラスのインスタンスを通して呼び出すことができます。
他の質問はありますか?なぜ彼らが必要なのか? Delphiでは、.NETのType
クラスと同じ問題を解決し、設計時にクラス名が分からないオブジェクトを作成することができます。 たとえば、フォームをデザインし、一連のコントロールを配置する場合、このデータはデザイナーによってシリアル化され、デシリアライズされなければなりません。フォームが逆シリアル化されると、実際には読み取られるメタタイプであり、正しいインスタンス(TextBox
、ComboBox
など)は、メタタイプで仮想コンストラクタを呼び出すことによって構築されます。
- 1. いいえ仮想コンストラクタではなく仮想デストラクタ
- 2. Win32仮想キーコード0xFFはどこに使用されていますか、それはどこかに文書化されていますか?
- 3. Delphiの仮想コンストラクタ
- 4. 仮想メモリはカーネル自体に使用されていますか?
- 5. 相対仮想パス 'x.resx'はここでは許可されていません
- 6. 相対仮想パス ''はここでは許可されていません
- 7. 仮想基底クラスのデフォルトのコンストラクタを使用しない
- 8. 仮想メソッドがコンストラクタ/デストラクタ内で使用されているかどうかを確認する方法はありますか?
- 9. ゲーム内で仮想マシンを使用していますか?
- 10. iOSのプロセスで使用される仮想メモリですか?
- 11. 仮想マシンはどこでオンラインで入手できますか?
- 12. ホストは、仮想マシンで使用されるドキュメントをどこに保存しますか?
- 13. 仮想呼び出しは、純粋仮想メンバーのアドレスを使用します。それは合法ですか?
- 14. 仮想デストラクタは宣言されていても実装されていないとどうなりますか?
- 15. Phusion Passengerを使用して開発用仮想ホストとプロダクション用仮想ホストを作成するにはどうすればよいですか?
- 16. 仮想マシンと仮想デスクトップの違いは何ですか?
- 17. 仮想マシンのストレステストに使用できるJavaアプリケーションはどれですか?
- 18. 保護されたコンストラクタと純粋な仮想デストラクタ
- 19. レガシー/めったに使用されないアプリケーションに仮想デスクトップを使用していますか?
- 20. Androidスタジオで仮想デバイスマネージャが無効にされています
- 21. オブジェクトクラス仮想でequalsメソッドが使用されるのはなぜですか?
- 22. Framework7仮想リストsearchAll関数が使用されていません
- 23. C++クラスの仮想関数テーブルはどこに格納されていますか?
- 24. Spotlightアイコンはどこで使用されていますか?
- 25. null BSTRはどこで使用されていますか?
- 26. dataTaskWithRequestメソッドはどこで使用されていますか?
- 27. 仮想レジストリ/仮想ファイルシステムプロジェクトを探しています
- 28. TestExecuteは仮想マシン上で実行されますか?
- 29. iisnodeでホストされているWebアプリケーションは、ホストされている仮想パスを処理できますか?
- 30. ASP.NETマージ:仮想パス 'obal.asax'は許可されていません
Delphiの構文は正しいです。 –
@Gamecat - ありがとう、私は "免責事項"を削除しました;)それはノイズとして必要はありません。 – Pete
実際、それは 'TMyClass = class'です、' = 'であり、': 'ではありません。 –