问题描述
我正在使用一个接口来确保某些相似的类实现某些强制性方法(子功能).
I'm using an interface to ensure some similar classes implements some mandatory methods (subs/functions).
示例:
- 接口I1声明M1和M2方法
- C1和C2实现I1,并具有自己的M1和M2版本.
C1和C2还需要完全相同的方法,例如SM1和SM2.
C1 and C2 also need methods that are exactly the same, for example methods SM1 and SM2.
为避免重复SM1和SM2,我想定义一个抽象类AC:
To avoid repeating SM1 and SM2 I'd like to define an abstract class AC:
- 实施I1
- 定义SM1和SM2.
将由C1和C2扩展
此解决方案确实可以在Java中实现,但是我找不到在VBA中进行此操作的任何文档. (VB.Net似乎允许使用关键字MustInherit的抽象类.)
This solution is indeed possible in Java, but I don't find any documentation for doing the same in VBA. (VB.Net seems to allow abstract classes using keyword MustInherit.)
是否可以在VBA中确认?
推荐答案
您可以在VBA中实现半装饰器:-)模式.可以说我们有一个基类和两个子类.如果在子类中使用Implements关键字,则将确保子类具有与基类相同的接口,并同时在每个子类中声明基类的私有实例,并将调用从子类重定向到基类.
You could implement semi-decorator :-) pattern in VBA. Lets say we have a base class and two child classes. If you use Implements keyword in child classes you will garatee that child classes has the same interface as the base class and at the same time declare a private instance of base class in each child class and redirect calls from children to base class.
注意:这里的基类是普通类,您仍然可以创建它的实例(因此它不是真正的抽象类).
Note: base class here is normal class, you can still create instances of it (so it is not real abstract class).
示例:
' Standard module
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
' -----------------------------------------------
' Base class module
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
' -----------------------------------------------
' ChildA class module
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
Output:
' 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:有像抽象类这样的东西吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!