Есть множество замечательных вопросов и замечательных ответов, которые приводятся здесь о концепции делегатов. В частности, этот ответ был более увлекательным. Я работаю с VBA и ранними версиями Java и С#. Я пытаюсь обновить с помощью полезных и немного расширенных концепций в более поздних версиях С# в качестве интереса и работы.
В VBA нет необходимости создавать классы/интерфейсы для выполнения чего-то вроде кучи вычислений с использованием нагрузки параметров с использованием пользовательской функции (UDF). Мы можем использовать UDF в другой функции VBA/sub или в листе Excel.
например, следующая функция в VBA принимает несколько параметров и возвращает вычисленное значение
Private Function DoSomeCalc(ByRef x as long, ByRef n as int, _
ByRef type as String) as long
//'--function implementation
End Function
С точки зрения понимания делегатов в реальном мире я искал совсем немного и нашел, что это хорошая дискуссия. Однако было бы очень полезно, если бы я мог рассказать о том, что я уже знаю.
Я лаю на правое дерево здесь?
Извините, но делегаты не работают, как Excel UDF. Вы не можете передать функцию или подпрограмму в качестве аргумента другой функции в VBA.
Не уверен, что это звонит вам, но они действительно выглядят как указатели функций в C: тип данных пользователя, который может содержать адрес функции с конкретным списком аргументов и определенным типом возврата; основанный на том, что вы можете хранить/вызывать любую функцию, которая соответствует "подписи"; это то, что позволяют делегаты, частично.
Теперь, на боковой ноте, указатели на функции расположены вокруг в C, так как прибл. 1971... поэтому делегаты похожи на джинсы с колокольчиками: снова в моде. :-)
Проводя это здесь для любых будущих поисковиков, желающих реализовать делегатов в vba.
Я думаю, что ближе всего вы можете войти в vba, чтобы предопределить, какие функции вы собираетесь разрешить своей "основной" функции для вызова с перечислением, а затем используйте оператор case, чтобы определить, какой из них выполнить.
Например:
Enum eDelegateFunction
eDelF_Foo
eDelF_Bar
End Enum
Private Function Foo(n as double) as double
Foo = n*2
End Function
Private Function Bar(n as double) as double
Bar = n^2
End Function
Public Function Delegator(f as eDelegateFunction, n as double) as double
Select case f
Case eDelF_Foo
Delegator = Foo(n)
Case eDelF_Bar
Delegator = Bar(n)
End Select
End Function