VBA:是否有类似抽象类的东西?

15 浏览
0 Comments

VBA:是否有类似抽象类的东西?

为了确保一些相似的类实现一些必需的方法(子函数),我正在使用一个接口。\n示例:\n

    \n

  • 接口I1声明了M1和M2方法
  • \n

  • C1和C2实现了I1,并且有它们自己的M1和M2版本。
  • \n

\nC1和C2还需要完全相同的方法,例如方法SM1和SM2。\n为了避免重复定义SM1和SM2,我想定义一个抽象类AC:\n

    \n

  • 实现I1
  • \n

  • 定义SM1和SM2。
  • \n

\n然后C1和C2可以继承该抽象类。\n这个解决方案在Java中确实可行,但我找不到在VBA中做相同的事情的任何文档。(VB.Net似乎允许使用关键字MustInherit来定义抽象类。)\n请确认VBA是否支持这种解决方案。

0
0 Comments

VBA中是否有类似于抽象类的东西?

在VBA中,没有直接支持抽象类的概念。然而,可以通过使用接口和类模块的继承来实现抽象类的功能。

在给定的解决方案中,通过创建一个抽象类模块(Abstract)和实现该抽象类的类模块(C1和C2),模拟了抽象类的行为。

解决方法是在抽象类模块(Abstract)中定义了一些抽象方法(M1和M2),这些方法在子类模块(C1和C2)中被实现。同时,抽象类模块中还定义了一个接口(IAbstract),子类模块需要实现该接口的方法。通过这种方式,可以在子类中重写抽象类的方法,并实现自己的逻辑。

在使用该解决方案时,首先创建抽象类的实例(Abstract),然后使用该实例的接口(IAbstract)来调用抽象类的方法。子类(C1和C2)继承了抽象类,并实现了相应的接口方法。

使用这种方法,可以在VBA中模拟抽象类的行为,并实现多态性。子类可以根据自己的需求重写抽象类的方法,并实现自己的逻辑。

在给定的代码示例中,通过创建C1和C2的实例,并调用其接口和抽象类的方法,可以看到结果已经成功地模拟了抽象类的行为。

通过这种解决方案,可以在VBA中实现类似于抽象类的功能,提高代码的可维护性和扩展性。

0
0 Comments

在VBA中,没有像抽象类(Abstract Class)那样的概念。然而,可以使用VBA中的一种模式来实现类似的功能,即半装饰器(semi-decorator)模式。通过在子类中使用Implements关键字,可以确保子类具有与基类相同的接口,并在每个子类中声明一个私有实例变量来引用基类,并将子类的调用重定向到基类。

下面是一个示例代码:

' 标准模块
Sub main()
    Dim a As New ChildA
    Dim b As New ChildB
    a.State = 2
    b.State = 5
    Debug.Print TypeOf a Is Base
    Debug.Print TypeOf b Is Base
    TestPolymorphic a
    TestPolymorphic b
End Sub
Private Sub TestPolymorphic(ByRef obj As Base)
    obj.Polymorphic
End Sub
' -----------------------------------------------
' 基类模块
Private m_state As Byte
Public Event StateChanged(oldState As Byte, newState As Byte)
Public Property Get State() As Byte
    State = m_state
End Property
Public Property Let State(ByVal newState As Byte)
    Dim oldState As Byte
    oldState = m_state
    m_state = newState
    RaiseEvent StateChanged(oldState, newState)
End Property
Sub Polymorphic()
    Err.Raise 123, , "Implement in child class"
End Sub
Private Sub Class_Initialize()
    m_state = 1
End Sub
' -----------------------------------------------
' 子类A模块
Implements Base
Private WithEvents m_base As Base
Private Sub Class_Initialize()
    Set m_base = New Base
End Sub
Public Property Get State() As Byte
    State = Base_State
End Property
Public Property Let State(ByVal newState As Byte)
    Base_State = newState
End Property
Public Sub Polymorphic()
    Base_Polymorphic
End Sub
Private Property Get Base_State() As Byte
    Base_State = m_base.State
End Property
Private Property Let Base_State(ByVal newState As Byte)
    m_base.State = newState
End Property
Private Sub Base_Polymorphic()
    Debug.Print "In Child A ..."
End Sub
Private Sub m_base_StateChanged(oldState As Byte, newState As Byte)
    Debug.Print "State of 'Child A' instance has changed from " & oldState & " to " & newState
End Sub

上述代码中,首先在标准模块中创建了两个子类的实例a和b,并尝试设置它们的状态。然后通过调用TestPolymorphic方法,测试了多态性(Polymorphic)方法。在基类模块中,定义了一个基类,其中包含一个状态属性和一个多态方法。在子类A模块中,通过Implements关键字实现了基类,并在子类的属性和方法中调用基类的对应方法。此外,还使用了WithEvents关键字,以便在子类中处理基类的StateChanged事件。

运行上述代码后,将得到以下输出:

State of 'Child A' instance has changed from 1 to 2
State of 'Child B' instance has changed from 1 to 5
True
True
In Child A ...
In Child B ...

这表明子类中重写的多态方法被成功调用,并且子类实例的状态改变事件也被正确处理。

通过使用半装饰器模式,可以在VBA中实现类似于抽象类的功能,尽管VBA本身并不直接支持抽象类的概念。

0
0 Comments

在VBA中没有继承的概念。你可以定义一个接口,并使用Implements关键字在类中实现接口。但是如果你想要通过一个基类来实现共享功能,你只能使用复制粘贴的方法。

这导致了一个问题:在VBA中是否存在类似于抽象类的东西?这个问题的出现是因为VBA中没有提供抽象类的机制,而继承是实现抽象类的一种常见方式。因此,VBA开发者想要在代码中使用抽象类的功能时会遇到困难。

然而,虽然VBA没有内置的抽象类机制,但仍然有一些解决方法。其中一个解决方法是使用接口和实现类的方式来模拟抽象类的功能。通过定义一个接口,然后在实现类中实现该接口,可以达到类似于抽象类的效果。这样,可以让多个类共享相同的方法和属性,并且可以确保这些方法和属性在实现类中得到正确的实现。

对于VBA中没有抽象类的问题,一些相关的阅读资料提供了更多的讨论和解决方案。其中一篇文章提到了如何在Excel VBA中使用接口的方法:How to use the Implements in Excel VBA。另一篇文章则介绍了如何在VBA中实现类对象模块之间的比较方法:How to use comparison methods between class object modules in VBA in a similar manner as VB.NET?

总之,尽管VBA中没有抽象类的机制,但开发者仍然可以通过使用接口和实现类的方式来模拟抽象类的功能。这种方法可以让多个类共享相同的方法和属性,并且可以确保这些方法和属性在实现类中得到正确的实现。

0