我正在使用Excel VBA(Excel 2010),并且在尝试使用继承时遇到了问题。基本上,我有一个接口MyInterface
和一个实现类MyImplementation
。在VBA代码中,当我引用类型为Dim
的{{1}}时,我只能访问该接口上定义的成员 - 这是预期的。当我引用类型为MyInterface
的{{1}}时,我无法访问其实现的界面上定义的成员 - 不期望。
为什么我不能在实现类上直接调用接口属性 ?
MyInterface的
Dim
MyImplementation
MyImplementation
MainModule - 用法示例
Option Explicit
Public Property Get Text() As String
End Property
主要问题是如何避免向下投射?
注意 - 上面的例子是有意设计的。我意识到直接引用实现类是一般不良做法。
答案 0 :(得分:6)
当我引用MyImplementation类型的Dim时,我无法访问它实现的接口上定义的成员 - 不期望。
解决方案是改变您的期望。这就是VBA中的工作方式:VBA类实现COM接口(例如IUnknown)而不公开它们。
如果要从类中公开接口的成员,则必须明确地这样做:
Option Explicit
Implements MyInterface
'The implementation of the interface method'
Private Property Get MyInterface_Text() As String
MyInterface_Text = "Some Text"
End Property
Public Property Get MoreText() As String
MoreText = "Yes, some more text!"
End Property
Public Property Get Text() As String
Text = MyInterface_Text
End Property
答案 1 :(得分:0)
简单地将实现方法声明为Public而不是Private将执行:
Option Explicit
' Class MyImpl
Implements MyInterface
'The implementation of the interface method'
'Notice the Public here instead of private'
Public Property Get MyInterface_Text() As String
MyInterface_Text = "Some Text"
End Property
唯一要记住的是,要调用实现方法,您需要使用更长的名称:
Dim instance as MyImpl
' initialize your instance
instance.MyInterface_Text
' instead of instance.Text
这就是全部。