今天Get到了VBA中的面向接口编程,以后写VBA代码就会优雅好看一些,而不只是简单粗暴地完成任务了事。
设计模式是一种良好的写代码套路,被编程者在应用面向对象的语言时所广泛采用。
在设计模式的运用中,接口作为重要数据类型不可或缺,VBA虽然不支持接口定义,但是用类来模拟接口,进而继承或者实现,就可以在VBA的编码中使用设计模式,让代码更加优雅、规范。
以策略模式为例:
1、定义计算接口:
Option Explicit
'定义抽象方法
Public Function Calculate(ByVal a As Double, ByVal b As Double) As Double
End Function
2、定义实现的算法
⑴ 加法
Option Explicit
Implements I计算
Public Function I计算_Calculate(ByVal a As Double, ByVal b As Double) As Double
I计算_Calculate = a + b
End Function
⑵减法
Option Explicit
Implements I计算
Public Function I计算_Calculate(ByVal a As Double, ByVal b As Double) As Double
I计算_Calculate = a - b
End Function
⑶乘法
Option Explicit
Implements I计算
Public Function I计算_Calculate(ByVal a As Double, ByVal b As Double) As Double
I计算_Calculate = a * b
End Function
3、根据用户选择采用不同的算法
Dim CalcMethod As I计算
Dim value1 As Double
Dim value2 As Double
' 根据用户输入的操作符选择不同的算法
Select Case InputBox("请选择要执行的操作:+ - *")
Case "+"
Set CalcMethod = New 加
Case "-"
Set CalcMethod = New 减
Case "*"
Set CalcMethod = New 乘
Case Else
MsgBox "错误选择!"
Exit Sub
End Select
' 输入两个数字
value1 = CDbl(InputBox("请输入第一个数字:"))
value2 = CDbl(InputBox("请输入第二个数字:"))
' 调用计算方法
MsgBox CalcMethod.Calculate(value1, value2)
这样,程序就可以根据用户的输入选择而采用不同的计算方法来得到结果。
上面我们是以策略模式来动态调整算法,也可以使用访问者模式来实现。
1、定义算法接口
Option Explicit
'定义抽象方法
Public Function Calculate(ByVal x1 As Double, ByVal x2 As Double)
End Function
2、定义算法实现
⑴加法
Option Explicit
Implements I计算
Public Function I计算_Calculate(ByVal x1 As Double, ByVal x2 As Double)
I计算_Calculate = x1 + x2
End Function
⑵减法
Option Explicit
Implements I计算
Public Function I计算_Calculate(ByVal x1 As Double, ByVal x2 As Double)
I计算_Calculate = x1 - x2
End Function
⑶乘法
Option Explicit
Implements I计算
Public Function I计算_Calculate(ByVal x1 As Double, ByVal x2 As Double)
I计算_Calculate = x1 * x2
End Function
3、定义数据对象
Private Value1 As Double
Private Value2 As Double
Private Result As Double
Private CalcMethod As I计算
Public Property Get 结果() As String
结果 = Result
End Property
Public Property Set mCalcMethod(N计算方法 As Object)
Debug.Print "选择方法"
CalcMethod = N计算方法
Result = CalcMethod.Calculate(Value1, Value2)
End Property
Public Property Let mValue1(ByVal a As Double)
Value1 = a
End Property
Public Property Let mValue2(ByVal a As Double)
Value2 = a
End Property
Public Property Let mResult(ByVal a As Double)
Result = a
End Property
Public Function SelectCalc(ByRef N1 As I计算)
Set CalcMethod = N1
Result = CalcMethod.Calculate(Value1, Value2)
End Function
4、测试
Sub test()
Dim pp As 数据体
Set pp = New 数据体
Dim ClacMothed As I计算
Set ClacMothed = New I计算
Dim N加法 As 加法
Set N加法 = New 加法
Dim N减法 As 减法
Set N减法 = New 减法
Dim N乘法 As 乘法
Set N乘法 = New 乘法
pp.mValue1 = 3
pp.mValue2 = 21
'加法
Set ClacMothed = N加法
pp.SelectCalc ClacMothed
Debug.Print pp.结果
'减法
Set ClacMothed = N减法
pp.SelectCalc ClacMothed
Debug.Print pp.结果
'乘法
Set ClacMothed = N乘法
pp.SelectCalc ClacMothed
Debug.Print pp.结果
End Sub
实际输出:
24
-18
63
就这么简单的两个设计模式,也是折腾了一上午,VBA的语法约束实在是怪异。