有没有办法为VBA中的一组类设置一组通用属性?

时间:2011-08-11 17:22:55

标签: vba interface polymorphism

我正在研究中的一个项目,其中有许多类用于查询来自各种来源的数据。由于这些类是相似的,我试图确定使用公共接口并使用Implements语句对我来说是一个可行的选择。我对OOP一般都是新手(尽管我试图用非VBA语言学习),而且我知道VBA中的OOP还有很多不足之处。

我一直在阅读的信息基本上表明您设置了接口类,我们将其称为IBaseInfo

Public Property Let LocationData(ByRef locDATA As udtLocData)
End Property

Public Property Let ReferenceDate(ByVal dteDATE As Date)
End Property

然后您实际在班级中实施IBaseInfo,我们将其称为clsRate5pt

Implements IBaseInfo

Private Property Let IBaseInfo_LocationData(Byref RHS As udtLocData)

End Property

Private Property Let IBaseInfo_ReferenceDate(ByVal RHS As Date)

End Property

我感到困惑的是我如何从模块中的对象级别实际访问属性。我从msdn的VBA多态性参考中获得的是,我需要实际声明类型为IBaseInfo的变量,将其设置为类型为clsRate5pt的对象并访问通过该变量的属性。如:

Sub TestIFace()

    Dim o5PT As clsRate5Pt
    Dim oInfo As IBaseInfo

    Set o5PT = New clsRate5Pt
    Set oInfo = o5PT

    oInfo.LocationData = '// Some location Data
    oInfo.ReferenceDate = '// Some Reference Date

End Sub

有没有办法为中的一组类设置一组通用接口?是Implements要走的路,如果是的话,我做错了什么?

通过不同的对象访问属性似乎是违反直觉的。如果clsRate5pt正在“实施”该界面,那么是不是应该有办法通过clsRate5pt访问这些属性?

3 个答案:

答案 0 :(得分:5)

VBA不支持继承(“是a”)但支持组合(“有一个”),所以你可以在这种情况下使用这种方法:

例如: “clsSettings”类具有公共属性以及要在其他类中实现的任何必需属性值检查。

您的其他课程则会有一个“设置”实例,可以公开为:

objRate5pct.Settings.LocationData
objRate5pct.Settings.ReferenceDate

答案 1 :(得分:0)

对于界面iFooBar

Option Explicit
Public Property Get Foo() as String

End Property

Public Property Get Bar() as String

End Property

然后,在你的班级(我们称之为cFooBar)

Option Explicit
Implements iFooBar

'Other class code

Public Property Get AsiFooBar() as iFooBar
    Set AsiFooBar = me
End Property

'More code

然后你可以从模块中引用iFooBar方法

dim cfb as cFooBar
set cfb = new cFooBar
debug.print cfb.AsiFooBar.Foo

答案 2 :(得分:0)

这是一个非常老的问题,但是我今天偶然发现了它,并且在对其进行了一些工作之后,我认为先前的答案都是错误的或者没有直接回答问题,所以这是我的职责OP想要的。

首先,我想说您的类IBaseInfoclsRate5pt都针对您要实现的目的正确定义了(因此,在这里我不会重现它们的代码)。

是的,您可以使用VBA中的接口来执行您想做的事情:确保几个类提供相同的基本属性,函数或方法集(每个以自己的方式实现)。

现在,缺少的是正确定义和实例化对象:

Sub TestIFace()
    ' Define the object you want to use polymorphically, 
    ' by using the interface you want to implement
    Dim oInfo As IBaseInfo 
    '// Instantiate the object by the concrete class you want to use
    Set oInfo = new clsRate5pt 

    ' Finally, access the properties, methods or functions 
    oInfo.LocationData = ...
    oInfo.ReferenceDate = ...

End Sub

现在您可以创建实现IBaseInfo的其他类,而只需替换行中的类名称

Set oInfo = new ...

获取oInfo对象的新业务逻辑。

但是请意识到,由于oInfo的类型为IBaseInfo,因此您只能使用IBaseInfo中定义的属性,函数或方法。您可以将oInfo强制转换为clsRate5pt,以访问该类以外的其他功能,但这将增加代码的耦合,并且可能会破坏首先定义接口的目的。能够非常轻松地切换特定的业务逻辑。

相关问题