Ответ 1
ООП сидит на 4 "столбах":
-
Абстракция. Абстрагирование логики и понятий может быть легко осуществлено путем определения объектов в модулях классов. Строго говоря, абстракция также достигается путем использования значимых идентификаторов и извлечения процедурного кода в методы (члены класса).
Вот пример процедуры, написанной в VBA, которая демонстрирует абстракцию:
Public Sub Test(ByVal checkin As Date, ByVal checkout As Date, ByVal custType As CustomerType) Dim finder As New HotelFinder InitializeHotels finder Debug.Print finder.FindCheapestHotel(checkin, checkout, custType) End Sub
Легко сказать, что делает эта процедура
Test
с первого взгляда, потому что уровень абстракции очень высок: детали реализации абстрагируются от более специализированных объектов и методов. -
Инкапсуляция. Классы могут иметь частные поля, открытые свойствами; классы могут быть сделаны
PublicNotCreatable
, эффективно подвергая типы другим проектам VBA - и с небольшим усилием (путем экспорта модуля класса, открытия его в вашем любимом текстовом редакторе, вручную редактирования атрибутов класса и повторного импорта модуля), вы можете достичь реальных неизменных типов. Тот факт, что нет параметризованных конструкторов, не имеет значения - просто напишите метод factory, который принимает все необходимые вам параметры и возвращает экземпляр. Это COM, и COM все равно любит фабрики.Вот пример того, как класс
HotelFinder
из приведенного выше фрагмента инкапсулирует объектCollection
и только предоставляет его через код доступаProperty Get
вне этого класса, просто не можетSet
использовать эту ссылку, он заключен в карантин:Private Type TFinder Hotels As Collection End Type Private this As TFinder Public Property Get Hotels() As Collection Set Hotels = this.Hotels End Property Private Sub Class_Initialize() Set this.Hotels = New Collection End Sub Private Sub Class_Terminate() Set this.Hotels = Nothing End Sub
-
Полиморфизм -
Implements
позволяет вам реализовывать абстрактные интерфейсы (и конкретные классы тоже), а затем вы можете писать код против абстракцииISomething
, которая может так же aFoo
илиBar
(заданныеFoo
иBar
оба реализуютISomething
) - и весь код, который когда-либо должен был увидеть, этоISomething
. Перегрузка метода - это языковая функция, которой не хватает VBA, но перегрузка не имеет ничего общего с полиморфизмом, который позволяет представить один и тот же интерфейс для разных базовых форм (данные типов).Здесь пример применяемого полиморфизма - метод
LogManager.Register
рад работать с любым объектом, реализующим интерфейсILogger
; здесь aDebugLogger
и aFileLogger
- регистрируются две совершенно разные реализации этого интерфейса; когдаLogManager.Log(ErrorLevel, Err.Description)
вызывается позже, обе реализации будут выполнять свою собственную работу;DebugLogger
выводит на непосредственный инструментальный режим, аFileLogger
будет записывать запись в указанный файл журнала:LogManager.Register DebugLogger.Create("MyLogger", DebugLevel) LogManager.Register Filelogger.Create("TestLogger", ErrorLevel, "C:\Dev\VBA\log.txt")
-
Наследование - VBA не позволяет выводить тип из другого: наследование не поддерживается.
Теперь вопрос в том, может ли язык, который не поддерживает наследование, квалифицироваться как "объектно-ориентированный"? Оказывается, композиция очень часто предпочтительнее наследования, которая имеет ряд предостережений. И VBA позволит вам создавать объекты для вашего сердечного контента.
Является ли VBA языком OOP?
Учитывая все, что отсутствует наследование, и эта композиция предпочтительнее наследования, я испытываю соблазн ответить "Да". Я написал полный код OOB VBA раньше (Model-View-Presenter с Unit-of-Work и Repository, кто-нибудь?), Что я бы не писал иначе на "реальном OOP" языке, который поддерживает наследование.
Вот несколько примеров, все 100% VBA:
- Индикатор прогресса многократного использования
- Модель-View-Presenter шаблон
- UnitOfWork с шаблоном репозитория
- Полиморфный регистратор
- Структура тестирования Automagic Unit
Код в этой последней ссылке был в конечном итоге перенесен на С# и быстро превратился в надстройку COM для VBA IDE, которая дает вам рефакторинг, лучшую навигацию, проверки кода и интегрированного источника IDE Git.
VBA ограничивается только тем, что вы делаете.