У меня есть интерфейс IValidator
, и я хочу, чтобы классы, реализующие IValidator
, имели доступ к общему набору свойств и методов, но, похоже, у VBA нет истинного наследования реализации, поэтому вместо этого у меня есть класс BaseValidator
с общими ресурсами , который используется в качестве делегата в подклассах.Наследование реализации в VBA?
Интерфейс:
'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 по сравнению с .NET позволяет нам избежать проблем с DLL. На данный момент мы также имеем несколько тысяч строк, поэтому было бы важной задачей перенести все на .NET – sigil
Насколько я понимаю, это была просто пища для размышлений - это сложный вызов, чтобы сделать b иногда, когда вам нужна «сложность», которую VBA не может предложить, лучше перенести на другой язык ранее в проекте, а не добираться до конца и ударять по кирпичной стене. Повторяющийся код может раздражать эту часть, но если проще переписывать все, то вам нужно пойти с меньшим количеством двух зол! (если предполагаемая функциональность поддерживает это решение!) –