Наследование VBA, аналог супер

Например, у меня есть класс A, который реализует класс B

--- класс A ----

implements B
public sub B_do()
end sub

- класс B ----

public sub do()
end sub

Как я могу вызвать do() из A? (super.do()) Итак, как я могу определить некоторую общую переменную для обоих классов? Теперь я могу наследовать только функции, sub и свойства...

добавил: тот же вопрос http://social.msdn.microsoft.com/Forums/en-US/vbgeneral/thread/5a83d794-3da1-466a-83d3-5d2eb0a054b2

добавлено: невозможно передать переменную через иерархию классов. Вы должны реализовать свойство (так же, как функции).

Ответ 1

Обычный способ сделать это в VBA состоит в том, чтобы иметь A содержать экземпляр B, а также иметь интерфейс B реализации, а затем делегировать вызовы на B-интерфейс A на внутренний B.

Это старый материал, но см. руководство для программистов Visual Studio 6.0:

http://msdn.microsoft.com/en-us/library/aa716285(VS.60).aspx

Существует глава "Многое (Inter) лица повторного использования кода", в котором описывается это соглашение:

http://msdn.microsoft.com/en-us/library/aa240846(v=VS.60).aspx

Способ, которым MS описывает это:

В дополнение к реализации абстрактных интерфейсов, вы можете повторно использовать свой код реализации интерфейса обычного класса, а затем выборочно делегирование скрытого экземпляра класс.

Это означает, что наследование реализации требует много явных методов делегирования. Там даже глава подзаголовка: "Разве это не утомительно?". Еще одна причина, по которой ООП в VBA является PITA (TM)...

ИЗМЕНИТЬ, ЧТО НЕ ПРИНИМАЕТ КОММЕНТАРИЙ:

Чтобы ответить на вопрос, который вы задали в своем комментарии, ну, A - это B. Когда вы создаете интерфейс B реализации, вы, по сути, говорите, что можете обрабатывать экземпляр A, как если бы он был на самом деле типа B. В VBA, как вы это делаете, объявляя переменную типа B, а затем устанавливая ее в экземпляр A. VBA будет знать, что делать, когда вы называете его как B:

Dim usedAsB as B
Dim anA as A

Set anA = New A
Set usedAsB = anA    'fine since A implements B

usedAsB.something()    'will call B_something() defined in class A

Насколько вы видите в окне отладки, я не понимаю, почему это выглядит так. И что касается принудительной делегации, я не уверен, что вы имеете в виду. VBA автоматически отправляет вызовы на интерфейс B в правильные методы в классе A. Если вы имеете в виду автоматическое генерирование кода для наследования реализации B способом, описанным выше, ничего подобного я не знаю для VBA. Я думаю, что различные "профессиональные" версии VB6 могут это сделать, но я никогда не использовал VB6, поэтому я не знаю.

Ответ 2

Можно подшутить, чтобы подражать наследству. Он работает с использованием свойства элемента по умолчанию.

Если вы дадите своему производному классу свойство с именем Super, тип которого является суперклассом, тогда сделайте его элементом по умолчанию (путем экспорта и редактирования файла для включения Attribute Item.VB_UserMemId = 0, повторного импорта), тогда вы можете достичь суперкласса только парой круглых скобок (который разрешает член по умолчанию).

Эта запись блога дает полную информацию, но автор (раскрытие, я) там использует "База" вместо "Супер"

Надеюсь, что синтаксис достаточно жесткий для вас.

Я также отмечаю, что это не раскрывает все внутренние силы базового класса, как в С#. Это означает, что мой метод не страдает от проблемы хрупкого базового класса. Т.е. мой метод сохраняет инкапсуляцию, что делает его лучше ИМХО.