Как можно использовать делегат и интерфейс взаимозаменяемо?

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

Ответы

Ответ 1

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

Ответ 2

Обратитесь Делегаты являются анонимными интерфейсами Марка Семанна

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

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

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();
}

Ответ 3

Самое большое преимущество использования делегатов вместо интерфейсов заключается в том, что, хотя класс может предоставлять только одну реализацию для любого данного интерфейса, он может создавать делегаты для любого количества различных методов. Например, предположим, что вместо того, чтобы подвергать событие Click, кнопка открыла свойство 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% времени, можно создать промежуточный класс-оболочку).