1. ホーム
  2. vba

[解決済み] VBAでコンストラクタに引数を渡す

2023-03-08 08:18:09

質問

自分のクラスに直接引数を渡すオブジェクトを作るにはどうしたらよいでしょうか?

このようなものです。

Dim this_employee as Employee
Set this_employee = new Employee(name:="Johnny", age:=69)

これができないのは非常に迷惑なことで、これを回避するために汚い解決策を取ることになります。

どのように解決するのですか?

私が最近使っている、良い結果をもたらすちょっとしたトリックを紹介します。VBAとよく格闘している人たちに教えてあげたい。

1.- 各カスタムクラスでパブリックな開始サブルーチンを実装してください。私は、すべてのクラスを通してInitiatePropertiesと呼んでいます。このメソッドは、あなたがコンストラクタに送りたい引数を受け入れなければなりません。

2.- factoryというモジュールを作成し、quot;Create"という単語とクラスと同じ名前、そしてコンストラクタが必要とするのと同じ入力引数を持つパブリック関数を作成します。この関数はクラスをインスタンス化し、(1)で説明した開始サブルーチンを、受け取った引数を渡して呼び出す必要があります。最後に、インスタンス化され、開始されたメソッドを返します。

例です。

カスタムクラスEmployeeがあるとします。前の例と同じように、名前と年齢を指定してインスタンス化する必要があります。

m_nameとm_ageは設定されるプライベートプロパティです。

Public Sub InitiateProperties(name as String, age as Integer)

    m_name = name
    m_age = age

End Sub

そして今度はファクトリーモジュールで

Public Function CreateEmployee(name as String, age as Integer) as Employee

    Dim employee_obj As Employee
    Set employee_obj = new Employee

    employee_obj.InitiateProperties name:=name, age:=age
    set CreateEmployee = employee_obj

End Function

そして最後に従業員をインスタンス化する場合

Dim this_employee as Employee
Set this_employee = factory.CreateEmployee(name:="Johnny", age:=89)

特に、複数のクラスがある場合に便利です。モジュールファクトリにそれぞれの関数を置き、インスタンスの作成は factory.CreateClassA(引数) , factory.CreateClassB(other_arguments)です。 などです。

EDIT

stenciが指摘したように、コンストラクタ関数でローカル変数を作成しないようにすれば、より短い構文で同じことを行うことができます。たとえば、CreateEmployee関数はこのように書くことができます。

Public Function CreateEmployee(name as String, age as Integer) as Employee

    Set CreateEmployee = new Employee
    CreateEmployee.InitiateProperties name:=name, age:=age

End Function

どっちが素敵かな。