尝试在VBA中进行继承有时会遇到以下问题:拥有一个子类的实例,并且需要从该子类重写的父类中调用一个函数。
简单示例:
在IGreeter.cls
Public Sub Greet()
End Sub
在PoliteGreeter.cls
Implements IGreeter
Private Sub IGreeter_Greet()
Debug.Print "Good morning"
End Sub
在Main.bas
Public Sub RunGreeter()
Dim MyGreeter As PoliteGreeter
Set MyGreeter = New PoliteGreeter
MyGreeter.Greet ' Doesn't work, function not defined
End Sub
对于此示例,当然有解决该问题的简单方法,我看到的两种方法是:
MyGreeter
定义为IGreeter
的实例。IGreeter_Greet
。这些解决方案都不是很好。对于第一个,如果我想访问PoliteGreeter
中的其他功能,则需要两个变量来访问其全部功能。第二种解决方案既丑陋又显得非常错误,特别是因为默认情况下VBE将定义设为私有。
但是,我看到了第三个解决方案,即也添加Greet
作为PoliteGreeter
的公共方法,如下所示:
Implements IGreeter
Public Sub Greet()
IGreeter_Greet
End Sub
Private Sub IGreeter_Greet()
Debug.Print "Good morning"
End Sub
第四个解决方案是执行第一个解决方案,并通过合成来解决我对附加功能的关注,因为VBA实际上并不进行继承。但是,我的问题是,第三种方法是否安全,是否有阴影,是否有警告,以及是否有其他更好的标准解决方案。