【问题标题】:Is there a way to set a common set of properties for a group of classes in VBA?有没有办法为 VBA 中的一组类设置一组通用属性?
【发布时间】:2011-08-11 17:22:54
【问题描述】:

我正在 的一个项目中工作,我有许多用于从各种来源查询数据的类。由于这些类相似,我试图确定使用通用接口和使用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 访问这些属性吗?

【问题讨论】:

    标签: excel-vba vba vba interface polymorphism


    【解决方案1】:

    VBA 不支持继承(“is a”),但支持组合(“has a”),因此您可以在这种情况下使用该方法:

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

    然后,您的其他类有一个您的“设置”实例,可以公开为:

    objRate5pct.Settings.LocationData
    objRate5pct.Settings.ReferenceDate
    

    【讨论】:

    • 谢谢蒂姆...据我了解,我会做类似...Public Property Get Settings() as clsSettings 之类的事情来真正在课堂上公开它?这似乎更接近我正在寻找的东西。感谢您的帮助
    【解决方案2】:

    对于界面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
    

    【讨论】:

      【解决方案3】:

      这是一个非常古老的问题,但我今天偶然发现了它,经过一些工作后,我认为之前的两个答案要么是错误的,要么没有直接回答这个问题,所以这是我的看法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 对象的新业务逻辑。

      请注意,由于oInfoIBaseInfo 类型,您只能使用IBaseInfo 中定义的属性、函数或方法。您可以将oInfo 转换为clsRate5pt 以访问该类独有的更多功能,但这会增加代码的耦合,并且可能会破坏首先定义接口的目的,即能够切换具体的业务逻辑很容易。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-24
        • 2015-08-01
        • 2011-06-02
        • 2020-12-04
        • 1970-01-01
        • 2020-06-24
        • 1970-01-01
        相关资源
        最近更新 更多