2017-07-10 7 views
0

class of [ClassName]の有用性を理解したかったので、私はthisという記事を読んでいましたが、仮想コンストラクタを宣言していることがわかりました。だから私はあなたがここに見ることができるテストを行った。Delphiの仮想コンストラクタ

enter image description here

私はコンパイル時に私が構築したいクラスを知らない時に仮想コンストラクタが有用であること(その記事から)理解します私はclass ofを使うことができます。私が上に示したコードでは、違いは何ですか?

TFirstをオーバーライドせずにvirtualとしてTFirstコンストラクタを宣言した場合、コース広告の警告が表示されますが、再導入または上書きで削除できます。しかし、コンストラクタは自動的にオーバーライドされません(左のコードを見てください)?私は彼らが同等であると思う。

+2

**コードにはスクリーンショットを使用しないでください。ハイライト表示されたコードを貼り付けることができます - '{}'ボタンを使うか、[here](https://stackoverflow.com/help/formatting)を見てください。 –

+0

これらは同等ではありません。クラス参照を介してインスタンスを作成しようとすると、違いが生じます。私は、ドキュメントがこれをカバーしていると確信しています。それは? –

+0

ドキュメンテーション:http://docwiki.embarcadero.com/RADStudio/en/Methods_(Delphi)#Constructors http://docwiki.embarcadero.com/RADStudio/en/Class_Referencesは常に文書を読むために賢明です –

答えて

4

このコードを両方のバリアントで実行すると、その違いがわかります。

type 
    TFirstClass = class of TFirst; 

constructor TFirst.Create; 
begin 
    Writeln('TFirst.Create'); 
end; 

constructor TSecond.Create; 
begin 
    Writeln('TSecond.Create'); 
end; 

var 
    firstClass: TFirstClass; 
    first: TFirst; 
begin 
    firstClass := TSecond; 
    first := firstClass.Create; 
end. 
+0

ステファン、ありがとう、実際に私の質問は:私はvritual /オーバーライド(父/子のコンストラクタで)を使用するかどうかの違いはありますか?一般的に私は –

+3

を意味します。私は、コード例を実行するとその違いがはっきりとわかると思います。 –

+1

この回答に示されているコードを、指定された宣言の実装@Raffaeleとして使用してください。非仮想の場合、 'TFirst'に関するメッセージだけが表示されますが、仮想の場合は' TSecond'に関するメッセージが表示されます。 (しかし、注意:*両方の*ケースでは、 'first is TSecond'が' True'を返します!) –

関連する問題