Как создать общий / общий экземпляр в VBA - PullRequest
6 голосов
/ 02 декабря 2010

Я хотел бы создать один экземпляр класса, который все остальные можно использовать до сих пор, я создаю каждый экземпляр в каждом классе, который нуждается в его методах.

Есть ли способ, которым я мог бы создать только один экземпляр, который будет виден другим классам.

Обычно я мог бы создать какую-то статическую переменную, которая была бы видна другим. Но это кажется невозможным в VBA: /

Ответы [ 2 ]

13 голосов
/ 02 декабря 2010

в модуле:

Private objSharedClass As myClass

Public Function GetShared() As myClass

    If objSharedClass Is Nothing Then
        Set objSharedClass = New myClass
    End If

    Set GetShared = objSharedClass

End Function

Это реализация VB (A) шаблона Singleton. Вы должны тщательно продумать, действительно ли это уместно, и если это так, то это способ сделать это. Когда я его использую, я обычно помещаю вышеупомянутый код в модуль самостоятельно (за исключением того, что если я использую более одного Singleton в приложении, я собираю их все вместе в одном модуле). Вы можете добавить подпрограмму уничтожения к тому же модулю и вызвать ее из выхода вашего приложения:

Public Sub CloseSingleton()

    Set objSharedClass = Nothing

End Sub

Или вы можете просто позволить ему выйти из области видимости, когда приложение закрывается - не так аккуратно, но я никогда не видел, чтобы это вызывало проблему (хотя я обычно убираю, хотя ...).

EDIT

Использование (на всякий случай, если это не очевидно). Или:

...
Set objLocalCopy = GetShared
DoSomethingWith objLocalCopy.MethodOrProperty
...

Или:

...
DoSomethingWith GetShared.MethodOrProperty
...

Первый вариант предпочтителен, если вы собираетесь использовать общий класс более одного раза в вызывающей подпрограмме, но второй отлично работает для одного вызова.

4 голосов
/ 02 декабря 2010

Сделайте подпрограмму или функцию в модуле, и вы сможете получить к ней доступ из других ваших классов.

ModuleName.MethodName
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...