Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 公开父项';VBA中子类实例中的s方法_Excel_Vba_Inheritance - Fatal编程技术网

Excel 公开父项';VBA中子类实例中的s方法

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

尝试在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 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
    的对象,并将其作为常规接口使用。由于您将直接引用子类,因此无法在运行时交换对象。如果你想重用代码(并且只保留在一个地方),你必须使用组合。这是一个很好的观点,我不做太多的运行时多态性,我主要使用它来组织代码。例如,如果有两个提供相同基本接口的对象,则应实现相同的接口,以便我可以为它们的通用行为编写代码,这两个对象可以共享,为它们的特定行为编写代码,这两个对象不能共享。