Почему BeginInvoke не возвращает ссылку типа AsyncResult?

При вызове объекта делегата BeginInvoke система создает объект типа AsyncResult, но BeginInvoke возвращает ссылку интерфейса IAsyncResult типа (который указывает на экземпляр AsyncResult). Почему BeginInvoke вместо этого не возвращает ссылку типа AsyncResult?

спасибо

7
задан AspOnMyNet 28 February 2010 в 18:45
поделиться

2 ответа

Это стандартное программирование на основе интерфейса.

Возвращая IAsyncResult, фреймворк может изменить внутреннюю реализацию в более позднее время, не нарушая код, написанный с использованием API фреймворка. По сути, это говорит нам, разработчикам, что нас не должно волновать, какой тип реализации используется, при условии, что интерфейс (IAsyncResult) удовлетворяется.

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

Кроме того, это позволяет фреймворку использовать один и тот же интерфейс (IAsyncResult) в нескольких местах, независимо от того, подходит ли класс AsyncResult или нет. Лично я воспользовался этим, создав свои собственные асинхронные функции, которые возвращают IAsyncResult, подкрепленные другим классом, который хранит важную для меня информацию. Это позволяет моему собственному коду работать как фреймворк, не ограничивая меня реализацией фреймворка.

8
ответ дан 7 December 2019 в 01:19
поделиться

Потому что он не всегда возвращает AsyncResult. Целевой объект делегата может существовать в другом контексте выполнения, производный класс RealProxy может реализовать для него прокси. Примером может служить удаленное взаимодействие. Возврат типа интерфейса делает это прозрачным.

2
ответ дан 7 December 2019 в 01:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: