- ベストアンサー
VB6.0のクラスで、自分自身のインスタンスを作成するメリット
クラスのメソッドで、自分自身のインスタンスを作成している、コードをよく見かけます。 どんなメリットがるのでしょうか? 簡単に、クラスファイルのコードを書きました。 【A.cls】 Option Explicit Dim pstrID As Long Dim pstrName As String Public Function fncCreate() As Object Set fncCreate = New clsA '★自分自身のインスタンスを作成する End Function Public Function fncID() As Boolean pstrName = "ID" End Function Public Function fncName() As Boolean pstrName = "STRING" End Function Private Sub Class_Initialize() pstrID = 0 pstrName = "" End Sub
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
「クラスの有効性」という説明がかなり的外れだと思いますが・・・(^^; そもそもクラスの中でそのクラスのインスタンスを作成するということは#1さんも仰っているように稀なのではないでしょうか。 さて、メリットですが私も全くと言ってよいほど思いつきません。 クラスを使う上で一番気をつけなければならないのは、インスタンスの管理です。 ご存知の通りインスタンスが破棄(アンロード)されるのは内部参照が全て無くなった時ですが このようなコードを書いてしまうと、内部参照が残ってしまいインスタンスの管理が上手く行かない可能性が出てきます。#1さんも指摘されていらっしゃいますが、2重にインスタンスが作成されてしまう恐れもあります。 挙げていらっしゃるコードでは単にインスタンスを(内部に保持せず)返す関数ですので そのような弊害は起こり難いでしょうが、単にNewを書かなくてすむというだけでこのようなコードを書いたとしても どこでNewしたのかが曖昧になります。 せいぜい、Clone()メソッドの実装などに使える程度でしょう。 >・Undo/Redo機能 >・ソート >・計算式の解析 ソートや計算式の解析(構文解析)を挙げているということは再帰を念頭に置いているのでしょうが Class_InitializeやTerminateのオーバーヘッドが大きいと思われるため 再帰を使ったほうが明らかに高速だと思いますし 分かりやすいのではないでしょうか? Undo/Redoなどのリスト構造を実装するのであればまだ分かる気はします。
その他の回答 (3)
- PED02744
- ベストアンサー率40% (157/390)
VBで見かけたことはないですが、JAVAだとよくみかけます。 というか、けっこう普通にこれを使ってたりする(笑) それもこれも、JAVAはmainが public static void main() なせいだ~ と板違いな場所で叫んでしまう(^_^;) staticな場所からはstatic変数/関数にしかアクセスできないという制限がありますので、 自分自身のインスタンスを作って、その制限を取り除くって感じですかね。 http://java-house.jp/ml/archive/j-h-b/005904.html あ、VBでこれが成り立つかどうか私はわかりませんので、あくまで参考意見させていただきます(^-^;
- dsuekichi
- ベストアンサー率64% (171/265)
> クラスのメソッドで、自分自身のインスタンスを作成している、コードをよく見かけます。 私は、ほとんど見たこと無いですね・・・ > どんなメリットがるのでしょうか? 私も「メリット」は無いと思います。 もし、そういうコードを書くとすると、 「既存インスタンスの設定内容に依存した新たなインスタンスを生成する」 様な時だと思います。 #例えば、Cron(既存インスタンスと同じ内容の新しいインスタンスを作成する)コマンドを実装するとか・・・ 要するに、「メリットがあるから」はなく、 「そうしたほうが作り易い(分かりやすい)機能を作成する」から、 使うんだと思います。
自分自身のインスタンスを作成するメリットは無いと思われます。 それどころか2重にインスタンスが作成される恐れがあります。 私はこのようなコードは見たことがありません。
補足
例えば、以下のHPで、紹介されています。 http://www.geocities.co.jp/SiliconValley-Bay/9960/vb/vbclass.html 4.クラスの有効性 クラスの使い方は説明しましたが、クラスをどのように使うと便利に感じるのでしょう。 クラスの特徴から見てみます。 クラスは、VBでのClass型のオブジェクトです。 これにより、自分自身を変数としてクラスに保持することができます。 つまり、オブジェクトの階層構造を簡単に処理することができます。 'TestClass内で、自分自身の型で変数を宣言する Dim ABC As TestClass これは構造体ではできません。たとえば Private Type Test1 ABC As Test1 End Type この場合エラーになります。 この機能を用いて次のようなものが考えられます。 ・Undo/Redo機能 ・ソート ・計算式の解析 ・パズルの計算 これら以外でも、ツリー構造になりうるものは大抵実現できます。