【发布时间】: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