在VBA中的子类实例中公开父方法

时间:2019-09-11 08:19:32

标签: excel vba inheritance

尝试在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

对于此示例,当然有解决该问题的简单方法,我看到的两种方法是:

  1. 改为将MyGreeter定义为IGreeter的实例。
  2. 公开替代功能并直接调用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实际上并不进行继承。但是,我的问题是,第三种方法是否安全,是否有阴影,是否有警告,以及是否有其他更好的标准解决方案。

0 个答案:

没有答案