2009-09-17 21 views
6

仮想コンストラクタについては、いくつかのデザインパターンの実装に使用されていますが、仮想コンストラクタの必要性は理解できませんでした。では、仮想コンストラクタは何ですか?また、なぜそれらが本当に必要なのですか?仮想コンストラクタはどこで使用されていますか?

答えて

12

ほとんどのプログラミング言語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クラスと同じ問題を解決し、設計時にクラス名が分からないオブジェクトを作成することができます。 たとえば、フォームをデザインし、一連のコントロールを配置する場合、このデータはデザイナーによってシリアル化され、デシリアライズされなければなりません。フォームが逆シリアル化されると、実際には読み取られるメタタイプであり、正しいインスタンス(TextBoxComboBoxなど)は、メタタイプで仮想コンストラクタを呼び出すことによって構築されます。

+0

Delphiの構文は正しいです。 –

+0

@Gamecat - ありがとう、私は "免責事項"を削除しました;)それはノイズとして必要はありません。 – Pete

+0

実際、それは 'TMyClass = class'です、' = 'であり、': 'ではありません。 –

関連する問題