複数あるクラスの Set ○○ = New □□ ひとつにまとめたい

解決


ちゃまぐ  2011-03-16 10:02:54  No: 102810  IP: [192.*.*.*]

複数のクラスモジュールがあるプログラムです。

【例】
クラスモジュールは Class1  Class2 Class3 Class4 ・・・ 複数あります。
クラスを使用するために下記の様にプログラムを作っています。

Dim clsObject1 As Object 
Dim clsObject2 As Object 
Dim clsObject3 As Object 
Dim clsObject4 As Object 

Set clsObject1 = New Class1 
Set clsObject2 = New Class2 
Set clsObject3 = New Class3 
Set clsObject4 = New Class4 
・・・
'後続の条件処理において、実際に使用するのは1つのクラスしかありません。


Dimの宣言を Dim clsObject As Object ひとつだけにして、 
条件処理を最初に行い、Set clsClass = New Class○ ひとつだけに
したいのですが、このような処理はできるのでしょうか?

編集 削除
魔界の仮面弁士  2011-03-16 11:34:14  No: 102811  IP: [192.*.*.*]

> Dimの宣言を Dim clsObject As Object ひとつだけにして、 
> 条件処理を最初に行い、Set clsClass = New Class○ ひとつだけに
> したいのですが、このような処理はできるのでしょうか?

たとえば、呼び出し側のコードを

  Dim clsObject As ISample   'もちろん、As Object でも受け取れます
  Set clsObject = Module1.CreateSample(0)
  clsObject.Test

のようにしても良いのなら、このように実装できます。


'------ クラス(ISample)
Option Explicit
Public Sub Test()
End Sub

'------ クラス(Class1)
Option Explicit
Implements ISample
Private Sub ISample_Test()
    MsgBox "Class1"
End Sub


'------ クラス(Class2)
Option Explicit
Implements ISample
Private Sub ISample_Test()
    MsgBox "Class2"
End Sub


'------ クラス(Class3)
Option Explicit
Implements ISample
Private Sub ISample_Test()
    MsgBox "Class3"
End Sub


'------ 標準モジュール(Module1)
Option Explicit
Public Function CreateSample(ByVal p As Integer)
    If p = 0 Then
        Set CreateSample = New Class1
    ElseIf p < 0 Then
        Set CreateSample = New Class2
    ElseIf p > 0 Then
        Set CreateSample = New Class3
    End If
End Function

編集 削除
ちゃまぐ  2011-03-18 16:39:56  No: 102812  IP: [192.*.*.*]

魔界の仮面弁士さん、ありがとうございます。
書込みした内容で対応できないか検討しましたが、

【引用】
> '------ 標準モジュール(Module1)
> Option Explicit
> Public Function CreateSample(ByVal p As Integer)
>    If p = 0 Then
>        Set CreateSample = New Class1
>    ElseIf p < 0 Then
>        Set CreateSample = New Class2
>    ElseIf p > 0 Then
>        Set CreateSample = New Class3
>    End If
>End Function

上記部分を

 Set CreateSample = New Class   ' ← ココを1回だけにしたいのです。
 If p = 0 Then
    CreateSample.Test
  ElseIf p < 0 Then
    CreateSample.Test
  ElseIf p > 0 Then
    CreateSample.Test
  End If

という感じにしたいのですが、出来ないでしょうか?

編集 削除
魔界の仮面弁士  2011-03-18 23:34:16  No: 102813  IP: [192.*.*.*]

> という感じにしたいのですが、出来ないでしょうか?

提示されたコードだけなら、
  Set CreateSample = New Class1
  CreateSample.Test p
のようにすれば済みそうですが…そういう事では無く?

編集 削除
Koz  2011-03-19 09:14:22  No: 102814  IP: [192.*.*.*]

ActiveX.DLL にして

Set CreateSample = CreateObject("hoge.Class" & CStr(p))

とか?

編集 削除
ちゃまぐ  2011-03-19 10:03:44  No: 102815  IP: [192.*.*.*]

魔界の仮面弁士さん、再度ありがとうございます。
その感じではないんですよね。

Kozさん、ありがとうございます。
対象になるクラスが、ActiveX.DLL 単位にありますので
可能であるかどうか試してみます。

編集 削除
ちゃまぐ  2011-03-23 14:15:34  No: 102816  IP: [192.*.*.*]

Kozさん、ありがとうございます。実現できました!

> Dim clsObject1 As Object 
> Dim clsObject2 As Object 
> Dim clsObject3 As Object 
>                                'DLLはActiveX.DLL です。    
> Set clsObject1 = New Class1    'A010.DLL のクラスモジュール
> Set clsObject2 = New Class2    'A020.DLL のクラスモジュール
> Set clsObject3 = New Class3    'A030.DLL のクラスモジュール

の部分を

Dim strClass AS String

If p = 0 Then
    strClass = "A010.Class1"
ElseIf p < 0 Then
    strClass = "A020.Class2"
ElseIf p > 0 Then
    strClass = "A030.Class3"
End if

Set CreateSample = CreateObject(strClass)

とすることで対応できました。
ありがとうございます。

魔界の仮面弁士さんも書込みありがとうございました。

編集 削除