- PR -

コンストラクタのPublic?

1
投稿者投稿内容
よっこらしょ
常連さん
会議室デビュー日: 2006/11/18
投稿数: 24
投稿日時: 2008-07-01 02:58
ふと疑問に思ったので質問します。
どの言語でも当てはまるんでしょうが、VB使ってるので、ここInsider.NET で。

コンストラクタはインスタンス化された時に自動的に実行されますよね?
なのでクラスから実行されていると考えて
 Private Sub New()
でいいと思うわけです。

しかし、C++などのデフォルトコンストラクタは
 Public:
  クラス名()
とPublicと同義ですよね。

まあ、他からコンストラクタを呼べるから良いんでしょうけど、他から呼ぶ状況はあまり無いと思います。
 オブジェクト名.New()
と他から実行されるのも変な感じ。

コンストラクタをPublic化するメリットは何なのでしょうか?
何か決定的なメリットがあるような機がするのですが。
Azulean
大ベテラン
会議室デビュー日: 2008/01/04
投稿数: 123
お住まい・勤務地: 大阪府
投稿日時: 2008-07-01 07:09
引用:

コンストラクタをPublic化するメリットは何なのでしょうか?
何か決定的なメリットがあるような機がするのですが。


Private Sub New()となっている場合、次のコードはエラーになります。
(コンストラクタがprivateの場合、他のクラスからインスタンス化できない)

Dim instance As New Class1

Using instance2 As New DisposableClass
' 〜
End Using


もちろん、Class1.CreateみたいなPublic Sharedな関数でインスタンスを生成するようにすれば良いのですが。
また、シングルトン等の特定のデザインではコンストラクタをprivateにすることはあり得ます。


ところで、このレスポンスは的を外してますか?
TAD
ベテラン
会議室デビュー日: 2007/03/20
投稿数: 52
お住まい・勤務地: 海のそば
投稿日時: 2008-07-01 10:30
私はC++しかわからん(それも序の口)のですが...

コンストラクタという名前からしてコンストラクタがコンストラクションしそう。
引用:
コンストラクタはインスタンス化された時に自動的に実行されますよね?
なのでクラスから実行されていると考えて

コンストラクタを実行している段階ではまだクラスの実体化は完了していないという考え
なのではないでしょうか。だから、クラスが完成した時点ではコントスラクタにより
クラスの諸々の状態が保証できる(初期化が完了している)ことになるし、また
呼び出すのは通常はクラス外から(クラスはまだ完成していない)だからアクセスとしては
publicでないと呼べない、と。
単に「クラス生成後最初に実行される命令群」だったら初期化とはちょっと意味合いが
違ってきてしまいそうです。「コンストラクタ」が最初に実行される命令群というだけなら
マルチタスクの際に、インスタンス化後で「コンストラクタ」実行前にインスタンスに
アクセスしたらどうなるかなんて考察が必要になってきたりして。

で、Azuleanさんも触れられているように、シングルトンではコンストラクタを
privateにして、クラスのインスタンス化をクラス側でコントロールします。
publicであるメリット、というよりはprivateに出来ることによって特定の用法が
できる、という感じですが。
#他の使い方があるのかも知れないけど知らない...
よっこらしょ
常連さん
会議室デビュー日: 2006/11/18
投稿数: 24
投稿日時: 2008-07-02 00:30
>(コンストラクタがprivateの場合、他のクラスからインスタンス化できない)

ありゃ、ほんとですね。
Newではインスタンスを作れない。
コンストラクタは関係無いと思ってたけど、違うんですね。

オブジェクト化する=コンストラクタにアクセスする
って事か。

でもコンストラクタの実行前に、そのインスタンスにアクセスするなんて出来るんでしょうかね?

デザインパターンに関しては用語だけ知ってて中身は知らないのですよ。
よく見るけど、シングルトンという用語の由来も知らない状態で。
知っておいた方がいいのかな。
Kazuki
ぬし
会議室デビュー日: 2004/10/13
投稿数: 298
投稿日時: 2008-07-02 12:44
引用:

でもコンストラクタの実行前に、そのインスタンスにアクセスするなんて出来るんでしょうかね?



Azuleanさんの書き込みにあるように、Privateだろうが自分自身からは使うことは出来ます。
Public Sharedなメソッドならインスタンス化されてる必要なないので、その中でNewしてしまえばいいってことです。
引用:

Azuleanさんの書き込み (2008-07-01 07:09) より:
もちろん、Class1.CreateみたいなPublic Sharedな関数でインスタンスを生成するようにすれば良いのですが。



引用:

デザインパターンに関しては用語だけ知ってて中身は知らないのですよ。
よく見るけど、シングルトンという用語の由来も知らない状態で。
知っておいた方がいいのかな。


ある程度知っておいた方がいいと思います。
今回みたいに「〜パターンみたいな感じ」って説明されることもあるので、知らないと説明聞いてもさっぱりわからないってことになったりしますので。
1

スキルアップ/キャリアアップ(JOB@IT)