Как работают необязательные параметры в свойствах Let / Get? - PullRequest
12 голосов
/ 10 июля 2011

Я использую VBA с Excel 2007 и пишу код для модуля класса.

1) Возможен ли следующий код? ...
По сути, у меня есть два перечисления, назовите их eDATASET и eDATATSUBSET. Конкретное значение из eDATASET должно инициировать присвоение из необязательно переданного параметра в свойстве Let. Примерно так:

Public Property Let foo(Optional ByVal lngSubSet as eDATASUBSET, _  
                        ByVal lngSuperSet as eDATASET)
    Select Case lngSuperSet
        Case eDATASET.abc, eDATASET.def
            mlngBar = lngSuperSet
        Case eDATASET.xyz
            '// if lngSubSet not passed, trigger error code...
            mlngBar = lngSubSet
    End Select
End Property

2) Как даже передать необязательный параметр в свойство для записи при вызове объекта ...
Помимо кажущегося обратного размещения параметров Optional (по сравнению с необязательными параметрами в функциях и подпрограммах), у меня возникают проблемы с поиском какой-либо документации по этой функции. Помощь vba говорит это:

Дополнительно. Указывает, что аргумент не требуется. При использовании все последующие аргументы в arglist также должны быть необязательными и объявляться с использованием ключевого слова Optional. Обратите внимание, что правая часть выражения Property Let не может быть необязательной.

и следующие от vbusers.com . Никто не объясняет многое в способе использования. Так как же передать необязательный параметр при вызове объекта из модуля кода ... oObj.foo = ???

3) Есть ли лучший способ сделать это? ...
У меня есть базовое понимание oop (по крайней мере, в том, как это реализовано в VBA). Есть ли лучший способ условно принять параметр в объект?

1 Ответ

13 голосов
/ 10 июля 2011

1) Да Ваш код возможен.

2) Вот как вы передаете аргумент:

Предположим, myObject является объектом вашего класса:

myObject.foo(lngSubSet) = lngSuperSet 

Размещение аргументов в arglist действительно выглядит странно, но это VBA для вас. Скажем, у вас есть 4 аргумента, два из которых являются необязательными, плюс ваша правая часть. Вы бы разместили их так:

Public Property Let foo(arg1, arg2, Optional arg3, Optional arg4, _  
                        RHS)

и используйте их вот так (при условии, что вы отказываетесь от arg4):

myObject.foo(arg1,arg2,arg3) = RHS

3) Есть ли лучший способ сделать это? Всегда есть, в зависимости от того, кого вы спрашиваете. Вы можете иметь свой аргумент lngSubSet как отдельное свойство. Вот как я склонен это делать. Но в вашем случае ваш образ действий может хорошо сработать для вас. Я не знаю, это во многом вопрос вкуса и зависит от вашего конкретного применения.

...