Ответ 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, поэтому я не знаю.