プロが教える店舗&オフィスのセキュリティ対策術

クラスのメソッドで、自分自身のインスタンスを作成している、コードをよく見かけます。
どんなメリットがるのでしょうか?
簡単に、クラスファイルのコードを書きました。

【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

A 回答 (4件)

「クラスの有効性」という説明がかなり的外れだと思いますが・・・(^^;


そもそもクラスの中でそのクラスのインスタンスを作成するということは#1さんも仰っているように稀なのではないでしょうか。

さて、メリットですが私も全くと言ってよいほど思いつきません。

クラスを使う上で一番気をつけなければならないのは、インスタンスの管理です。
ご存知の通りインスタンスが破棄(アンロード)されるのは内部参照が全て無くなった時ですが
このようなコードを書いてしまうと、内部参照が残ってしまいインスタンスの管理が上手く行かない可能性が出てきます。#1さんも指摘されていらっしゃいますが、2重にインスタンスが作成されてしまう恐れもあります。

挙げていらっしゃるコードでは単にインスタンスを(内部に保持せず)返す関数ですので
そのような弊害は起こり難いでしょうが、単にNewを書かなくてすむというだけでこのようなコードを書いたとしても
どこでNewしたのかが曖昧になります。
せいぜい、Clone()メソッドの実装などに使える程度でしょう。

>・Undo/Redo機能
>・ソート
>・計算式の解析

ソートや計算式の解析(構文解析)を挙げているということは再帰を念頭に置いているのでしょうが
Class_InitializeやTerminateのオーバーヘッドが大きいと思われるため
再帰を使ったほうが明らかに高速だと思いますし
分かりやすいのではないでしょうか?

Undo/Redoなどのリスト構造を実装するのであればまだ分かる気はします。
    • good
    • 0

VBで見かけたことはないですが、JAVAだとよくみかけます。


というか、けっこう普通にこれを使ってたりする(笑)

それもこれも、JAVAはmainが public static void main() なせいだ~
と板違いな場所で叫んでしまう(^_^;)
staticな場所からはstatic変数/関数にしかアクセスできないという制限がありますので、
自分自身のインスタンスを作って、その制限を取り除くって感じですかね。
http://java-house.jp/ml/archive/j-h-b/005904.html

あ、VBでこれが成り立つかどうか私はわかりませんので、あくまで参考意見させていただきます(^-^;
    • good
    • 0

> クラスのメソッドで、自分自身のインスタンスを作成している、コードをよく見かけます。



私は、ほとんど見たこと無いですね・・・

> どんなメリットがるのでしょうか?

私も「メリット」は無いと思います。
もし、そういうコードを書くとすると、
「既存インスタンスの設定内容に依存した新たなインスタンスを生成する」
様な時だと思います。

#例えば、Cron(既存インスタンスと同じ内容の新しいインスタンスを作成する)コマンドを実装するとか・・・

要するに、「メリットがあるから」はなく、
「そうしたほうが作り易い(分かりやすい)機能を作成する」から、
使うんだと思います。
    • good
    • 0

自分自身のインスタンスを作成するメリットは無いと思われます。


それどころか2重にインスタンスが作成される恐れがあります。

私はこのようなコードは見たことがありません。

この回答への補足

例えば、以下のHPで、紹介されています。

http://www.geocities.co.jp/SiliconValley-Bay/996 …

4.クラスの有効性
クラスの使い方は説明しましたが、クラスをどのように使うと便利に感じるのでしょう。
クラスの特徴から見てみます。
クラスは、VBでのClass型のオブジェクトです。
これにより、自分自身を変数としてクラスに保持することができます。
つまり、オブジェクトの階層構造を簡単に処理することができます。


'TestClass内で、自分自身の型で変数を宣言する
Dim ABC As TestClass
これは構造体ではできません。たとえば


Private Type Test1 ABC As Test1
End Type
この場合エラーになります。
この機能を用いて次のようなものが考えられます。
・Undo/Redo機能
・ソート
・計算式の解析
・パズルの計算
これら以外でも、ツリー構造になりうるものは大抵実現できます。

補足日時:2007/01/03 00:56
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!