- - PR -
コンストラクタのPublic?
1
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2008-07-01 02:58
ふと疑問に思ったので質問します。
どの言語でも当てはまるんでしょうが、VB使ってるので、ここInsider.NET で。 コンストラクタはインスタンス化された時に自動的に実行されますよね? なのでクラスから実行されていると考えて Private Sub New() でいいと思うわけです。 しかし、C++などのデフォルトコンストラクタは Public: クラス名() とPublicと同義ですよね。 まあ、他からコンストラクタを呼べるから良いんでしょうけど、他から呼ぶ状況はあまり無いと思います。 オブジェクト名.New() と他から実行されるのも変な感じ。 コンストラクタをPublic化するメリットは何なのでしょうか? 何か決定的なメリットがあるような機がするのですが。 | ||||||||||||
|
投稿日時: 2008-07-01 07:09
Private Sub New()となっている場合、次のコードはエラーになります。 (コンストラクタがprivateの場合、他のクラスからインスタンス化できない) Dim instance As New Class1 Using instance2 As New DisposableClass ' 〜 End Using もちろん、Class1.CreateみたいなPublic Sharedな関数でインスタンスを生成するようにすれば良いのですが。 また、シングルトン等の特定のデザインではコンストラクタをprivateにすることはあり得ます。 ところで、このレスポンスは的を外してますか? | ||||||||||||
|
投稿日時: 2008-07-01 10:30
私はC++しかわからん(それも序の口)のですが...
コンストラクタという名前からしてコンストラクタがコンストラクションしそう。
なのではないでしょうか。だから、クラスが完成した時点ではコントスラクタにより クラスの諸々の状態が保証できる(初期化が完了している)ことになるし、また 呼び出すのは通常はクラス外から(クラスはまだ完成していない)だからアクセスとしては publicでないと呼べない、と。 単に「クラス生成後最初に実行される命令群」だったら初期化とはちょっと意味合いが 違ってきてしまいそうです。「コンストラクタ」が最初に実行される命令群というだけなら マルチタスクの際に、インスタンス化後で「コンストラクタ」実行前にインスタンスに アクセスしたらどうなるかなんて考察が必要になってきたりして。 で、Azuleanさんも触れられているように、シングルトンではコンストラクタを privateにして、クラスのインスタンス化をクラス側でコントロールします。 publicであるメリット、というよりはprivateに出来ることによって特定の用法が できる、という感じですが。 #他の使い方があるのかも知れないけど知らない... | ||||||||||||
|
投稿日時: 2008-07-02 00:30
>(コンストラクタがprivateの場合、他のクラスからインスタンス化できない)
ありゃ、ほんとですね。 Newではインスタンスを作れない。 コンストラクタは関係無いと思ってたけど、違うんですね。 オブジェクト化する=コンストラクタにアクセスする って事か。 でもコンストラクタの実行前に、そのインスタンスにアクセスするなんて出来るんでしょうかね? デザインパターンに関しては用語だけ知ってて中身は知らないのですよ。 よく見るけど、シングルトンという用語の由来も知らない状態で。 知っておいた方がいいのかな。 | ||||||||||||
|
投稿日時: 2008-07-02 12:44
Azuleanさんの書き込みにあるように、Privateだろうが自分自身からは使うことは出来ます。 Public Sharedなメソッドならインスタンス化されてる必要なないので、その中でNewしてしまえばいいってことです。
ある程度知っておいた方がいいと思います。 今回みたいに「〜パターンみたいな感じ」って説明されることもあるので、知らないと説明聞いてもさっぱりわからないってことになったりしますので。 |
1