Excel 公开父项';VBA中子类实例中的s方法
尝试在VBA中执行继承时,我有时会遇到这样的问题:拥有子类的实例,并且需要从父类调用子类重写的函数 快速示例: 在Excel 公开父项';VBA中子类实例中的s方法,excel,vba,inheritance,Excel,Vba,Inheritance,尝试在VBA中执行继承时,我有时会遇到这样的问题:拥有子类的实例,并且需要从父类调用子类重写的函数 快速示例: 在IGreeter.cls中 Public Sub Greet() End Sub Implements IGreeter Private Sub IGreeter_Greet() Debug.Print "Good morning" End Sub 在PoliteGreeter.cls中 Public Sub Greet() End Sub Implements IGre
IGreeter.cls中
Public Sub Greet()
End Sub
Implements IGreeter
Private Sub IGreeter_Greet()
Debug.Print "Good morning"
End Sub
在PoliteGreeter.cls中
Public Sub Greet()
End Sub
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\u Greet
这两种解决方案都不是很好。对于第一个,如果我想访问PoliteGreeter
中的附加功能,我需要两个变量来访问它的全部功能。第二种解决方案既丑陋又似乎非常错误,特别是因为VBE默认将定义设置为私有
然而,我看到了第三种解决方案,那就是添加Greet
作为礼貌问候者的公共方法,如下所示
Implements IGreeter
Public Sub Greet()
IGreeter_Greet
End Sub
Private Sub IGreeter_Greet()
Debug.Print "Good morning"
End Sub
第四个解决方案是执行第一个方案,并通过组合解决我对附加功能的担忧,因为VBA实际上并不执行继承。然而,我的问题是,第三种方法是否安全,是否有阴影,是否有警告,是否有其他更好的标准解决方案来解决这类问题。VBA中没有继承。用构图代替。。。不幸的是,没有更好的解决方案,VBA的OOP能力在这方面相当有限。您在问题中已经指出了这一点,我将为链接留下注释。第三种解决方案很好,但您将失去使用接口的优势,也可以不使用它。@L8n我想我的想法是,在某些情况下,尽管VBA不执行OOP,如果我能够充分模仿它,我就可以创建1个类而不是2个类,这意味着当合成并没有给我带来任何额外的东西时,我将有更少的代码需要担心,更少的东西需要命名。还有,你说我失去了使用接口的优势是什么意思?我仍然可以将对象传递给任何需要IGreeter
的对象,并将其作为常规接口使用。由于您将直接引用子类,因此无法在运行时交换对象。如果你想重用代码(并且只保留在一个地方),你必须使用组合。这是一个很好的观点,我不做太多的运行时多态性,我主要使用它来组织代码。例如,如果有两个提供相同基本接口的对象,则应实现相同的接口,以便我可以为它们的通用行为编写代码,这两个对象可以共享,为它们的特定行为编写代码,这两个对象不能共享。