2016-09-13 47 views
11

私は解決できない疑いがあります。私はclass constructorsのembarcaderoのドキュメントを読んだことがありますが、その意味を理解することはできません。言い換えれば、constructorclass constructorの使用法の違いは何ですか?私はこれをした:Delphiのコンストラクタとクラスのコンストラクタ

type 
TGeneric<T> = class 
    private 
    FValue: T; 
    aboutString: string; 
    procedure setValue(const a: T); 
    public 
    property V: T read FValue write setValue; 
    property about: string read aboutString; 
    constructor Create; 
    destructor Destroy; override; 
end; 

implementation 

{ TGeneric<T> } 

constructor TGeneric<T>.Create; 
begin 
    inherited; 
    aboutString := 'test'; 
end; 

代わりにこのコードが正常に動作していない:

type 
TGeneric<T> = class 
    private 
    FValue: T; 
    aboutString: string; 
    procedure setValue(const a: T); 
    public 
    property V: T read FValue write setValue; 
    property about: string read aboutString; 
    class constructor Create; 
    destructor Destroy; override; 
end; 

implementation 

{ TGeneric<T> } 

class constructor TGeneric<T>.Create; 
begin 
    inherited; 
    aboutString := 'test'; 
end; 

私は答えは文書のこの行であることを推測する:クラスのコンストラクタがある

通常、クラスの静的フィールド を初期化するか、初期化のタイプを実行するために使用されます。クラスまたはインスタンスが正しく機能するには、 が必要です。

私は正しい午前なら、私に教える:

  • コンストラクタ:私はそうで、inherited Create;を使用する変数を初期化することができます。
  • クラスコンストラクタ:クラスにオブジェクトをすぐに作成する必要があるときにこれを使用できますか?

例えばにて下記をご覧:ここ

type 
    TBox = class 
    private 
    class var FList: TList<Integer>; 
    class constructor Create; 
    end; 

implementation 

class constructor TBox.Create; 
begin 
    { Initialize the static FList member } 
    FList := TList<Integer>.Create(); 
end; 

end. 

私は、メインフォームでTBox.Createを呼び出したときに、すぐにオブジェクトを作成するつもりですか?

+3

あなたのクラスタイプを自動的に開始する手段として、クラスコンストラクタを考えてみましょう。これらは起動時に自動的に呼び出されるため、コードで呼び出してはいけません。言い換えれば、クラスコンストラクタはその型で動作し、通常のコンストラクタはあなたの変数で動作します。 –

+0

だから私はそれを避けることができ、古典的なコンストラクタだけを気にしますか? –

+0

それはあなたが何をしたいかによって異なります。クラスvarは、その型のグローバル変数の一種であり、場合によっては有益なこともあります。 –

答えて

17
  • クラスコンストラクタは、宣言されたユニットが初期化されると、1回だけ実行されます。クラスコンストラクタは静的なクラスメソッドなので、Selfは定義されていません。
  • コンストラクタは、明示的に呼び出されたときに実行され、クラスのインスタンスを初期化するジョブを持ちます。

野生のクラスコンストラクタはまれであり、コンストラクタはmuckと同じです。あなたはすぐにクラスのコンストラクタが必要ないので、今のところそれらを無視してください。コンストラクタを記述して使用する方法の理解に集中する。

将来、(インスタンスが所有するのではなく)クラスが所有する変数を初期化する必要がある場合は、クラスコンストラクタを使用したいと思うかもしれません。その時点まで、それらを無視するように自由に感じてください。

+3

クラスが使用されている場合、 'class constructor' ** only **が実行されることに注意してください。つまり、ユニットの通常の 'initialization'セクションとは異なり(常に実行されます)、クラスが*どこかで使用されている場合にのみ実行されます。 'class destructor'についても同じことが言えます。 –

+0

初期化セクションは、ユニットが参照されている場合にのみ実行されます。同様に、クラスコンストラクタです。クラスが参照されている場合にのみ呼び出されます。 –

+0

クラスが** used **の場合のみ。クラスの変数を宣言することはできますが、それは実行されません。ユニットが含まれると、Initセクションは常に実行されます。 –

関連する問題