Qwertiy писал(а):Каким образом? Поместить в коллекцию некий объект, имеющий дефаултное свойство?
Объект, который олицетворяет процедуру, у которого будет метод (назовём его Invoke), у которого будут ParamArray-аргументы и который будет промаркирован как член-по-умолчанию. То есть не обязательно это должно быть get-свойство, это может быть и метод.
Вот например, делаю класс по имени Callable:
- Код: Выделить всё
Public Function Invoke(ParamArray args() As Variant)
Debug.Print "Something callable has been called with args: ";
For Each arg In args
Debug.Print arg;
Next arg
Debug.Print "."
CallThis = Int(Rnd * 100)
End Function
В Procedure Attributes ставлю Procedure ID = (Default).
А вот пример использования:
- Код: Выделить всё
Dim func1 As New Callable
Dim proc2 As New Callable
Dim x As Long
proc2 1, 2, Now, "hello"
x = func1(27, 100)
Debug.Print "func1 has returned: "; x
Вот что вывелось:
- Код: Выделить всё
Something callable has been called with args: 1 2 17.11.2014 16:54:53 hello.
Something callable has been called with args: 27 100 .
func1 has returned: 53
Как видно, VB6/VBA/VBScript в частности и OLE Automation вообще позволяет любую функцию/процедуру или вообще любую логику обернуть в объект, который с одной стороны будет полноценным COM-объектом (можно наделить его какими-нибудь другими интересными методами и свойствами или научить его поддерживать некие дополнительные COM-интерфейсы для разных нужд, вроде рефлексии), а с другой стороны — с точки зрения языка будет вызывабелен как обыкновенная процедура или функция.
То есть некая абстрактная
obj.meth(2, 3) где-нибудь в коде может быть как вызовом нативного метода meth (если он есть), так и обращением к члену meth, который является объектом-функцией, инкапсулирующей в себя какую-то логику.
Это значит, что на уровне кода можно получить объекты-функции такие же как, к примеру, в JavaScript. А если сделать возможность наделять объект в run-time новыми свойствами (о чём и есть этот топик) по мере необходимости (кстати, keks-n по моему заданию уже давно делал такой класс и, кажется, выкладывал здесь), то получится ещё большая иллющия ООП в стиле JavaScript.
Можно будет на ходу создать пустой объект, «присобачить» к нему после этого набор нужных мемберов (обычных свойств) и методов, и получить объект со свойствами и методами.
- Код: Выделить всё
Set obj = new JSLikeObject
obj.foo = 33
obj.bar.baz = 23
obj.bar.kaas = 23
obj.meth = compiler.compile("a, b", "MsgBox a+b") ' Возвращат объект, олицетворяющий скомпилированную функцию
obj.meth(2, 3) ' Выведет 5
А потом, при большом желании, можно и как прототип (в стиле JS) использовать этот объект.
То есть используя механику COM/ActiveX и особенность VB, можно устроить жизнь по правилам JS (близкую к ним), но наоборот, к сожалению, не получится.
__________
Более того, возможно даже и такое: можно иметь такую функцию или процедуру, что у неё от рождения есть отождествляющий её функциональный объект, и при этом указатель на функцию и указатель на объект — это одно и то же значение. То есть одно и то же значение можно передавать всем: и тем, кто просто хочет указатель на код (ждёт адрес какого-нибудь callback-а), и тем, кто знает о нашей фишке (некоем интерфейсе ICallable), и сумеет с ним правильно поработать.
Обо всём этом я хотел написать большую статью (и недавно, кажется, даже заикался об этом), но вот только когда?...