【问题标题】:Implementation inheritance in VBA?VBA中的实现继承?
【发布时间】:2015-04-13 16:13:51
【问题描述】:

我有一个接口IValidator,我希望实现IValidator 的类能够访问一组共享的属性和方法,但似乎VBA 没有真正的实现继承,所以我有一个类BaseValidator 与共享资源,在子类中用作委托。

界面:

'IValidator

Public Function isValid(columnName As String) As Boolean
End Function

'used for initializing delegate
Public Sub setup(fieldsDict As Dictionary)
End Sub

基类:

'BaseValidator

Public fieldsDict As Dictionary

Public Sub setup(fieldsDict As Dictionary)
Set Me.fieldsDict = fieldsDict
End Sub

Public Function doSomethingWithFieldsDict(columnName as string) as variant
'do something
End Function

示例实现:

'Validator_FeatureNumber

Private bv As New BaseValidator

Implements IValidator

Public Sub IValidator_setup(fieldsDict As Dictionary)
bv.setup fieldsDict
End Sub

Function IValidator_isValid(columnName As String) As Boolean
IValidator_isValid = IsNumeric(bv.doSomethingWithFieldsDict(columnName))
End Function

这可行,但这意味着我必须在每个实现中复制IValidator_setup() 代码块,这对于代码可维护性来说似乎是个坏主意。有没有办法让子类从 VBA 中的超类继承方法?

【问题讨论】:

  • VBA 不支持继承,它从来没有被设计成这样。从长远来看,您可能会发现将项目转换为基于 .NET 的语言会更容易?
  • 这是一个集成到 Excel 工作簿中的项目,因此使用 VBA over .NET 可以避免 DLL 问题。此时我们还有几千行代码,因此将所有内容移植到 .NET 将是一项艰巨的任务。
  • 我明白,这只是一些值得深思的东西 - 这是一个很难做出的决定,但有时当您需要 VBA 无法提供的“复杂性”时,最好在早期移植到另一种语言该项目而不是直接完成并撞到一堵砖墙。这部分重复的代码可能很烦人,但如果重写所有内容更容易,那么你必须选择2个邪恶中的较小者! (只要预期的功能支持该决定!)

标签: vba oop inheritance


【解决方案1】:

简短的回答是否定的。 欢迎来到 1991 年的有趣和令人兴奋的世界:) VBA 是 VB6 的子集。当时不支持继承,而且因为微软基于 VB6 的 VBA,然后在他们转到 .Net 时放弃了*,这意味着它可能永远不会:(

*他们确实对其进行了一些更新以应对 64 位 API 调用,但仅此而已。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-24
    • 1970-01-01
    • 2015-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多