初期化できるようにしたい
CArticle
には次のプロパティがあります:
_Private pNumber As String
Private pQuantity As Double
_
空の、事前定義された、または現在の値のいずれか。どうすればこれを達成できますか?私は次のことに沿って何かを考えています:
新しい空CArticle
_pNumber
pQuantity
_
新しいダミーCArticle
_pNumber
pQuantity = 99999
_
新しいinit CArticle(number, quantity)
_pNumber = number
pQuantity = quantity
_
首の痛みですが、これが唯一の方法です。
ファイルCArticle
Option Explicit
Private pNumber As String
Private pQuantity As Double
Private Sub Class_Initialize()
pNumber = vbNullString
pQuantity = 0
End Sub
Public Sub InitializeWithValues(ByVal number As String, ByVal quantity As Double)
pNumber = number
pQuantity = quantity
End Sub
Public Sub InitializeDefaultValues()
pNumber = vbNullString
pQuantity = 99999
End Sub
そして呼び出しモジュールで
Dim art As New CArticle ' Initialize value to empty
art.InitializeWithValues "Bowtie", 100 ' and assign values
Set art = New CArticle ' Initialize values to empty
art.InitializeDefaultValues ' Initialize values to default
誰かが検索でここに来た場合は、私もそうでした。代わりに、 StackOverFlow:VBAのコンストラクターに引数を渡す の答えを見るようにお勧めします
これは私の答えではありません、それは Bgusach からのものです。ここでは、便利な答えは単なるリンクではないので、ここに含めています。
ここに少しトリックがあります I'm 最近使用して良い結果をもたらします。 Bgusach は、VBAと頻繁に戦わなければならない人々と共有したいと思います。
1 .-各カスタムクラスにパブリック開始サブルーチンを実装します。私はすべてのクラスでInitiatePropertiesと呼んでいます。このメソッドは、コンストラクターに送信する引数を受け入れる必要があります。
2 .-ファクトリと呼ばれるモジュールを作成し、Wordの「作成」とクラスと同じ名前、同じ入力でパブリック関数を作成します。コンストラクタが必要とする引数。この関数は、クラスをインスタンス化し、ポイント(1)で説明した開始サブルーチンを呼び出して、受け取った引数を渡す必要があります。最後に、インスタンス化され開始されたメソッドを返しました。
例:
カスタムクラスEmployeeがあるとします。前の例のように、isは名前と年齢でインスタンス化する必要があります。
これはInitiatePropertiesメソッドです。 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(arguments)、factoryを呼び出すだけでインスタンス化します.CreateClassB(other_arguments)など.
Stenciが指摘したように、コンストラクター関数でローカル変数を作成しないようにすることで、terser構文で同じことを行うことができます。たとえば、CreateEmployee関数は次のように記述できます。
Public Function CreateEmployee(name as String, age as Integer) as Employee
Set CreateEmployee = new Employee
CreateEmployee.InitiateProperties name:=name, age:=age
End Function
どちらがいいですか。