2015-02-12 18 views
2

У меня есть интерфейс 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?

+0

VBA не поддерживает наследование, оно никогда не предназначалось. Возможно, в долгосрочной перспективе вам может быть проще переносить проект на .NET-язык? –

+0

Это для проекта, который интегрирован в книгу Excel, поэтому переход с VBA по сравнению с .NET позволяет нам избежать проблем с DLL. На данный момент мы также имеем несколько тысяч строк, поэтому было бы важной задачей перенести все на .NET – sigil

+0

Насколько я понимаю, это была просто пища для размышлений - это сложный вызов, чтобы сделать b иногда, когда вам нужна «сложность», которую VBA не может предложить, лучше перенести на другой язык ранее в проекте, а не добираться до конца и ударять по кирпичной стене. Повторяющийся код может раздражать эту часть, но если проще переписывать все, то вам нужно пойти с меньшим количеством двух зол! (если предполагаемая функциональность поддерживает это решение!) –

ответ

1

Короткий ответ: нет. Добро пожаловать в веселый и увлекательный мир 1991 года :) VBA - это подмножество VB6. Наследование не поддерживалось в то время, и потому, что Microsoft VBA на VB6, а затем отказался от этого, когда они отправились на .Net, это означает, что он, вероятно, никогда не будет :(

* Они немного обновили его, чтобы справиться с w/64-битные API-вызовы, но это было в значительной степени.

Смежные вопросы