仮想コンストラクタはどこで使用されますか?
-
08-07-2019 - |
質問
仮想コンストラクターはいくつかの設計パターンの実装に使用されますが、仮想コンストラクターの必要性を理解していませんでした。それでは、仮想コンストラクタとは何であり、なぜそれらが本当に必要なのでしょうか?
解決
ほとんどのプログラミング言語afaikでは、仮想コンストラクターは見つかりません。仮想メンバーのオーバーライドは、オブジェクトの構築後に実行時に評価されますが、ほとんどの言語では、インスタンスを構築するときに実際のクラスを知る必要があります。したがって、これらの言語では仮想コンストラクタは意味がありません。
.NETでは、リフレクションを介して同様のソリューションを取得できます。つまり、構築するオブジェクトを表すTypeクラスのインスタンスを介してオブジェクトを構築できます。また、一般的なサポートにより、同様のことも実現できますが、仮想コンストラクタではありません。
真の仮想コンストラクタを持つ、私が使用した唯一のプログラミング言語はDelphiです。 Delphiには、特定の「メタクラスタイプ」、つまりメタクラスを表す特定のプログラミング構成要素があります(一方、.NETでは、メタクラス、 Type
クラスは、通常のインスタンスですクラス)。したがって、 TMyClass
というクラスがある場合-Deplhiの命名規則;)
TMyClass : Class ...
このようにメタクラスを宣言できます
TMyMetaClass : class of TMyClass
今、 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
など)が構築されますメタタイプ。