Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 两类模块的优缺点_Vba - Fatal编程技术网

Vba 两类模块的优缺点

Vba 两类模块的优缺点,vba,Vba,使用Class1而不是Class2的优点或缺点是什么? 存储在类的每个实例中的数量信息将根据需要进行上下调整(通过函数),虽然我认为我只需要将这些变量公开,以便从类外部可以看到它们,但我觉得这很可能是不应该这样做的原因 第一类 Option Explicit Public Sequence As String Public Quantity As Double Public Sub AddQty(sAddQty As Double) Quantity = Quantity + Add

使用Class1而不是Class2的优点或缺点是什么? 存储在类的每个实例中的数量信息将根据需要进行上下调整(通过函数),虽然我认为我只需要将这些变量公开,以便从类外部可以看到它们,但我觉得这很可能是不应该这样做的原因

第一类

Option Explicit
Public Sequence As String
Public Quantity As Double


Public Sub AddQty(sAddQty As Double)
    Quantity = Quantity + AddQty
End Sub

Public Sub SubQty(sSubQty As Double)
    Quantity = Quantity - sSubQty
End Sub
类别2

Option Explicit
Private iSeq As String
Private iQty As Double

Public Property Get Qty() As Double
    Qty = iQty
End Property

Public Property Let Qty(lQty As Double)
    iQty = lQty
End Property

Public Property Get Sequence() As String
    Sequence = iSeq
End Property

Public Property Let Sequence(lSeq As String)
    iSeq = lSeq
End Property

Public Sub AddQty(sAddQty As Double)
    iQty = iQty + AddQty
End Sub

Public Sub SubQty(sSubQty As Double)
    iQty = iQty - sSubQty
End Sub

就接口而言,这两者完全相同,因为公共字段公开为
Property
成员

Implements Class1
Implements Class2
编译器将强制您添加以下成员:

Private Property Get Class1_Sequence() As String
End Property

Private Property Let Class1_Sequence(ByVal RHS As String)
End Property

Private Property Get Class1_Quantity() As Double
End Property

Private Property Let Class1_Quantity(ByVal RHS As Double)
End Property

Private Sub Class1_AddQty(sAddQty As Double)
End Sub

Private Sub Class1_SubQty(sSubQty As Double)
End Sub
Private Property Get Class2_Sequence() As String
End Property

Private Property Let Class2_Sequence(ByVal RHS As String)
End Property

Private Property Get Class2_Qty() As Double
End Property

Private Property Let Class2_Qty(ByVal RHS As Double)
End Property

Private Sub Class2_AddQty(sAddQty As Double)
End Sub

Private Sub Class2_SubQty(sSubQty As Double)
End Sub
如果您添加了另一个类模块并编写了以下内容:

Implements Class1
Implements Class2
编译器将强制您拥有基本相同的成员:

Private Property Get Class1_Sequence() As String
End Property

Private Property Let Class1_Sequence(ByVal RHS As String)
End Property

Private Property Get Class1_Quantity() As Double
End Property

Private Property Let Class1_Quantity(ByVal RHS As Double)
End Property

Private Sub Class1_AddQty(sAddQty As Double)
End Sub

Private Sub Class1_SubQty(sSubQty As Double)
End Sub
Private Property Get Class2_Sequence() As String
End Property

Private Property Let Class2_Sequence(ByVal RHS As String)
End Property

Private Property Get Class2_Qty() As Double
End Property

Private Property Let Class2_Qty(ByVal RHS As Double)
End Property

Private Sub Class2_AddQty(sAddQty As Double)
End Sub

Private Sub Class2_SubQty(sSubQty As Double)
End Sub
当属性什么都不做,也没有适当封装其值的动机时,请继续使用公共字段

然而,当后台字段公开一个
属性Let
访问器时,几乎不需要
AddQty
SubQty
实例方法-可以简单地执行
foo.Quantity=foo.Quantity+2
。一个似乎提供多种方法来执行相同操作的API是一个令人困惑的API

因此,您要做的是定义一个显式接口,该接口定义了您要使用的API:

Public Property Get Quantity() As Double
End Property

Public Property Get Sequence() As String
End Property

Public Sub AddQty(ByVal value As Double)
End Sub

Public Sub SubQty(ByVal value As Double)
End Sub
然后让你的类
实现这个接口(比如,
ISomething
),代码的其余部分使用此
ISomething
接口,该接口仅公开您希望它能够使用的成员,并且不包括类“
属性Let
成员;代码的其余部分只查看它需要查看的内容,并且只能访问它需要访问的内容

Dim foo As ISomething
Set foo = New Something
'foo.Quantity = 42 ' illegal

Dim bar As Something
Set bar = foo
bar.Quantity = 42 ' ok
bar.AddQty 2
Debug.Print foo.Quantity ' should be 44

这一切都取决于谁将使用这些对象,以及您希望对封装的要求有多严格。从功能上来说,它们并没有那么大的不同。我正在使用的excel加载项将使用它们在几个集合中存储以下信息。
生产中的所有零件=>单个零件=>零件的所有生产步骤=>数量O在给定的顺序下,我第一次真正深入研究了类模块,我不想养成坏习惯,以后不得不改掉。这个例子有助于澄清一些问题up@GlennG如果您正在深入研究类和OOP,我建议您学习,这将在VBA中演示全面的OOP。干杯