Почему BeginInvoke не возвращает ссылку типа AsyncResult? - PullRequest
7 голосов
/ 28 февраля 2010

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

* 1003 спасибо *

Ответы [ 2 ]

8 голосов
/ 28 февраля 2010

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

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

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

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

2 голосов
/ 28 февраля 2010

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

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