我希望能够初始化
CArticle
具有以下属性:
Private pNumber As String
Private pQuantity As Double
具有空值,预定义值或当前值。我怎样才能做到这一点?我正在考虑以下几点:
新空CArticle
pNumber
pQuantity
新假人CArticle
pNumber
pQuantity = 99999
新初始CArticle(number, quantity)
pNumber = number
pQuantity = quantity
答案 0 :(得分:26)
颈部疼痛,但这是唯一的方法。
文件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
答案 1 :(得分:0)
如果有人通过搜索到达这里,我也是。我建议改为查看StackOverFlow: Pass arguments to Constructor in VBA
中的答案这不是我的答案,它来自Bgusach。我将其包含在此处是因为我看到一个有用的答案不仅仅是链接。
这里有一个I'm的小技巧,可以带来很好的效果。 Bgusach想与那些需要经常与VBA战斗的人分享。
1 .- 在每个自定义类中实现一个公共初始化子例程。我在所有课程中都将其称为InitiateProperties。此方法必须接受您要发送给构造函数的参数。
2 .- 创建一个名为factory的模块,并创建一个公共函数,其中包含单词“ Create”以及与该类相同的名称以及与构造函数相同的传入参数。该函数必须实例化您的类,并调用第(1)点中解释的初始化子例程,并传递接收到的参数。最后返回实例化和初始化的方法。
示例:
假设我们有自定义类Employee。如上例所示,必须使用名称和年龄实例化。
这是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
哪个更好。