这里的初级VBA程序员(以及一般的编程初学者)希望了解有关OOP的有效性的更多信息。
有人可以解释或提供讨论使用的好处/目的的参考 - 在VBA中对类模块的内部Private Property Get
和/或Let
/ Set
语句直接访问属性虽然数据不需要操作吗?
示例:
我创建了一个cDimension
类(在Excel中)。此类将行绘制为Shape
个对象,以及其他一些不相关的内容。 DrawingScale
变量允许根据需要缩放整个图形。一些属性在获取/设置时需要操作,而其他属性则不需要。
因此,例如,pWidth
需要缩小进入:
'clsDimension
Private pWidth As Single
Private Property Get Width() As Single
Width = pWidth
End Property
Private Property Let Width(w As Single)
pWidth = w / DrawingScale
End Property
但是pColor
不需要任何操作,进出:
Private pColor As Integer
Private Property Get Color() As Integer
Color = pColor
End Property
Private Property Let Color(c As Integer)
pColor = c
End Property
pWidth属性是一个实例,其中使用私有属性Get和Let方法来处理类本身内部的过程对我来说是有意义的。但是,我的问题是:是否有任何理由也使用私有属性方法来获取和设置pColor属性,正如我在上面给出的那样?
Public Function Line(sht As Worksheet, L As tLine, Optional c = vbBlack) As Shape
Width = DistanceBetweenTwoPoints(L.first.x, L.first.y, _
L.second.x, L.second.y) '<-- pWidth is scaled
Color = c '<-- Vs. just using pColor = c
Set Line = sht.Shapes.AddLine(L.first.x, L.first.y, L.second.x, L.second.y)
End Function
提前致谢。
答案 0 :(得分:1)
我看到的价值是简化的代码,您没有在示例代码中利用它。您可以替换为:
'clsDimension
Private pWidth As Single
Private Property Get Width() As Single
Width = pWidth
End Property
Private Property Let Width(w As Single)
pWidth = w / DrawingScale
End Property
与此:
'clsDimension
Private Property Get Width() As Single
Width = w / DrawingScale
End Property
这消除了访问pWidth或width属性的潜在歧义,因为pWidth不再存在。它还可以消除在编写Width之前被读取的潜在陷阱,尽管明智的做法是在读取Width之前添加一些代码来检查w和DrawingScale是否已设置为有效值。
答案 1 :(得分:0)
如果你没有在进出途中操纵值,只需使用公共变量即可。 VBA更像是Python而不是Java或C ++,因为从公共变量切换到“getter / setter”函数没有真正的惩罚。
假设您从以下代码开始:
'clsCar
Public Speed As Double
Public Sub Drive()
MsgBox "Driving at " & Speed & " MPH"
End Sub
'Module1
Sub DriveCar()
Set Car = New clsCar
Car.Speed = 100
Car.Drive 'shows msg: "Driving at 100 MPH"
End Sub
然后你决定快速驾驶是危险的,所以你想为你的车辆添加一个“调速器”并需要更新你的班级:
'clsCar
Private mSpeed As Double
Private Const SpeedLimit As Double = 55
Public Property Get Speed()
Speed = mSpeed
End Property
Public Property Let Speed(Val As Double)
If Val > SpeedLimit Then
mSpeed = SpeedLimit
ElseIf Val < 0 Then
mSpeed = 0
Else
mSpeed = Val
End If
End Property
Public Sub Drive()
MsgBox "Driving at " & Speed & " MPH"
End Sub
'Module1
'Note that no changes to this code are necessary; the change
' is entirely encapsulated within the class (as it should be)
Sub DriveCar()
Set Car = New clsCar
Car.Speed = 100
Car.Drive 'shows msg: "Driving at 55 MPH"
End Sub
蒂姆·威廉姆斯的评论是你经常听到的在VBA中不必要地使用Get / Let / Set的理由,但这是其他语言(特别是C ++和Java)错误应用于VBA / VB6的好建议的副产品。 / p>
答案 2 :(得分:0)
一如既往....这取决于。绝对应该通过字母访问您的x属性,因为该字母对输入执行计算。
'clsDimension
Private Let Width(w As Single)
pWidth = w / DrawingScale
End Property
您应该不直接访问pWidth
变量。如果您这样做,则必须在模块中的其他位置复制pWidth = w / DrawingScale
逻辑。
您的pColor
属性可能是一个公共变量,因为获取或设置它没有逻辑。我不推荐它。如果以后你意识到你不想允许某些颜色怎么办?然后你需要它背后的逻辑,你还是需要切换到一个属性。该属性更易于维护,语义更正确。