如何避免向下转换为接口类?

时间:2014-05-21 00:49:55

标签: vba excel-vba inheritance casting excel

我正在使用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

主要问题是如何避免向下投射?

注意 - 上面的例子是有意设计的。我意识到直接引用实现类是一般不良做法。

2 个答案:

答案 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

这就是全部。