Подтвердить что ты не робот

Является ли VBA языком ООП и поддерживает ли он полиморфизм?

Я действительно работаю над своим первым проектом VBA. (из С++)

Я хотел бы улучшить существующий проект VBA, используемый книгой Microsoft Excel, путем реализации классов и полиморфизма.

Моя проблема:

1 - Я прочитал много статей/форумов, которые объясняют, что VBA не является языком объектно-ориентированного программирования (ООП) и не поддерживает полиморфизм.

Некоторые из них предлагают обходное решение, используя ключевое слово Реализованные.

2 - Я также нашел некоторые веб-страницы, такие как этот, которые объясняют, как выполнять ООП и полиморфизм в VBA с использованием таких ключевых слов, как Наследует, Переопределяет, Overridable, MustOverrides.

Итак, мой вопрос:

Является ли VBA языком ООП и поддерживает ли он полиморфизм?

4b9b3361

Ответ 1

ООП сидит на 4 "столбах":

  • check Абстракция. Абстрагирование логики и понятий может быть легко осуществлено путем определения объектов в модулях классов. Строго говоря, абстракция также достигается путем использования значимых идентификаторов и извлечения процедурного кода в методы (члены класса).

    Вот пример процедуры, написанной в 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 с первого взгляда, потому что уровень абстракции очень высок: детали реализации абстрагируются от более специализированных объектов и методов.

  • check Инкапсуляция. Классы могут иметь частные поля, открытые свойствами; классы могут быть сделаны 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
    
  • check Полиморфизм - Implements позволяет вам реализовывать абстрактные интерфейсы (и конкретные классы тоже), а затем вы можете писать код против абстракции ISomething, которая может так же a Foo или Bar (заданные Foo и Bar оба реализуют ISomething) - и весь код, который когда-либо должен был увидеть, это ISomething. Перегрузка метода - это языковая функция, которой не хватает VBA, но перегрузка не имеет ничего общего с полиморфизмом, который позволяет представить один и тот же интерфейс для разных базовых форм (данные типов).

    Здесь пример применяемого полиморфизма - метод LogManager.Register рад работать с любым объектом, реализующим интерфейс ILogger; здесь a DebugLogger и a FileLogger - регистрируются две совершенно разные реализации этого интерфейса; когда LogManager.Log(ErrorLevel, Err.Description) вызывается позже, обе реализации будут выполнять свою собственную работу; DebugLogger выводит на непосредственный инструментальный режим, а FileLogger будет записывать запись в указанный файл журнала:

    LogManager.Register DebugLogger.Create("MyLogger", DebugLevel)
    LogManager.Register Filelogger.Create("TestLogger", ErrorLevel, "C:\Dev\VBA\log.txt")
    
  • nope Наследование - VBA не позволяет выводить тип из другого: наследование не поддерживается.


Теперь вопрос в том, может ли язык, который не поддерживает наследование, квалифицироваться как "объектно-ориентированный"? Оказывается, композиция очень часто предпочтительнее наследования, которая имеет ряд предостережений. И VBA позволит вам создавать объекты для вашего сердечного контента.

Является ли VBA языком OOP?

Учитывая все, что отсутствует наследование, и эта композиция предпочтительнее наследования, я испытываю соблазн ответить "Да". Я написал полный код OOB VBA раньше (Model-View-Presenter с Unit-of-Work и Repository, кто-нибудь?), Что я бы не писал иначе на "реальном OOP" языке, который поддерживает наследование.

Вот несколько примеров, все 100% VBA:

Код в этой последней ссылке был в конечном итоге перенесен на С# и быстро превратился в надстройку COM для VBA IDE, которая дает вам рефакторинг, лучшую навигацию, проверки кода и интегрированного источника IDE Git.

VBA ограничивается только тем, что вы делаете.

Ответ 2

Короткими ответами нет и нет.

VBA основан на объектах, позволяя вам определять классы и создавать экземпляры объектов, но в нем отсутствуют функции, которые обычно связаны с полноценным языком ООП, например:

  • Инкапсуляция и абстракция: VBA обеспечивает это в некоторой степени. Классы могут храниться в закрытом режиме с помощью общих интерфейсов, однако для классов внутри классов не предусмотрено никаких условий. В классах есть событие Class_Inititalize, которое может выполнять некоторую конструкцию, но не может принимать аргументы. Для принятия аргументов потребуется создать общедоступную factory функцию для создания шаблона дизайна в стиле конструктора.
  • Наследование: на самом деле не существует в VBA, но может быть почти реплицировано
  • Полиморфизм: может быть достигнут в некоторой степени через интерфейсы (используя Implements), хотя возможность перегрузки функций (например) не существует, и каждая "перегрузка" технически требует уникального имени функции. Вы можете обойти это, передав объект в качестве единственного параметра функции или подпрограммы и изменив процедуру в зависимости от значений свойств.

Таким образом, хотя вы можете работать с объектами до некоторой степени, а приложения MS Office основаны на объектной модели, VBA не является объектно ориентированным языком. Полиморфизм не может быть достигнут в той мере, в какой вы были бы знакомы с С++.