Как делегат и интерфейс могут использоваться взаимозаменяемо? - PullRequest
1 голос
/ 06 января 2010

Могу ли я использовать интерфейсный метод вместо делегата? Как? Я обнаружил, что поиск метода интерфейса быстрее, чем использование делегатов. Буду признателен за простой фрагмент кода.

Ответы [ 3 ]

6 голосов
/ 06 января 2010

Теоретически можно выполнить все, что делают делегаты, с помощью интерфейсов (например, в Java нет делегатов), содержащих один метод. Однако это делает код более многословным и добавляет мало пользы. Опять же, можно сделать все без классов и, возможно, сделать это быстрее. Это не значит, что вы должны избегать использования классов. Вызов метода делегата может быть незначительно медленнее, чем вызов метода интерфейса. Вам не нужно заботиться о микрооптимизации. Используйте то, что соответствует вашим конкретным потребностям.

3 голосов
/ 20 декабря 2013

См. . Делегаты - анонимные интерфейсы. Марк Симан

В приведенной выше статье Марк Симанн упоминает пример

Подход к интерфейсу

public interface IMyInterface
{
    int DoIt(string message);
}
public string DoStuff(IMyInterface strategy)
{
    return strategy.DoIt("Ploeh").ToString();
}

Делегированный подход

public string DoStuff(Func<string, int> strategy)
{
    return strategy("Ploeh").ToString();
}
0 голосов
/ 26 января 2011

Самое большое преимущество использования делегатов вместо интерфейсов состоит в том, что, хотя класс может предоставить только одну реализацию для любого данного интерфейса, он может создавать делегаты для любого числа различных методов. Например, предположим, что вместо предоставления события Click, Button предоставляется свойство ClickRecipient типа IButtonClickHandler с одним методом «ButtonClick». Форма с двумя кнопками, которые должны иметь разные обработчики, должна была бы определять отдельный класс для обработки хотя бы одного из них, поскольку сама форма могла бы иметь только одну реализацию ButtonClick. Напротив, событие Button принимает делегата для EventHandler, а форма может создавать делегатов для любого числа методов EventHandler.

Обратите внимание, что с помощью обобщений и «типов маркеров» можно значительно уменьшить эту проблему, если у Button (Of T) имеется свойство ClickRecipientProperty типа IButtonClickHandler (Of T); таким образом, форма может иметь Button (Of FooButton) и Button (Of BarButton) и предоставлять различные реализации для своих интерфейсов. Можно также иметь класс-обертку ButtonConverter (Of T, U), который будет реализовывать IButtonClickHandler (Of T) и вызывать IButtonClickHandler (Of U) .ButtonClick.

Интерфейсы хороши, если шаблон использования будет 99% времени совпадать с тем, для чего предназначен интерфейс (оставшиеся 1% времени можно создать промежуточный класс-обертку).

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