2012-06-26 2 views
4

Согласно этому article, он говорит:Когда использовать делегат Вместо интерфейсов

Использование делегата в следующих случаях:

  • Класса может понадобиться более одного реализации методы.

Используйте интерфейс в следующих случаях:

  • класс необходим только один вариант осуществления способа.

Может кто-нибудь объяснить это мне?

+1

Вы можете рассматривать делегаты как интерфейсы с одним методом. – Steven

+3

Я оставил отзыв в статье MSDN, что формулировка может быть более четкой. –

ответ

3

Класс может потребоваться более чем одной реализации метода.

public delegate int PerformCalculation(int x, int y); 

void SomeMethod() 
{ 
    PerformCalculation PerformCalculation_1 = myDelegateFun_1; 
    PerformCalculation PerformCalculation_2 = myDelegateFun_2; 
    PerformCalculation_1(5, 3); 
    PerformCalculation_2(5, 3);  
} 

private int myDelegateFun_1(int x, int y) 
{ 
    return x + y; 
} 
private int myDelegateFun_2(int x, int y) 
{ 
    return x + y; 
} 

В приведенном выше примере PerformCalculation_1, PerformCalculation_2 кратны реализация PerformCalculation

A class only needs one implementation of the method 

 

interface IDimensions 
{ 
    float Length(); 
} 

class Box : IDimensions 
{ 
    float Length() 
    { 
     return lengthInches; 
    } 
} 

В приведенном выше примере реализации только одного метода выставленный интерфейсом.

+1

Тип делегата * также * "содержит только сигнатуры методов, делегатов или событий" - точно существует только один метод. Делегат-экземпляр также подходит для «реализации методов, выполняемых в {thing}, который реализует« тип делегата ». –

+0

Спасибо @Marc Gravell – Adil

+0

@Marc Gravell, я попытался понять данное заявление и придумал обновленный ответ. Не могли бы вы просмотреть его. – Adil

3

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

Если бы я должен был подвести итог:

делегат типа очень-очень похож на интерфейс, который только выставляет один метод, и делегат-экземпляр очень-очень похож на экземпляр класса, реализует что интерфейс - только с большим количеством компиляторов сексуальности, чтобы сделать его очень легко писать, т.е. x => 2 * x, и без (иногда) необходимость экземпляра.

делегат также имеет некоторые другие полезные приемы, которые отвечают events (мульти-актеров, и т.д.), но это звучит не связано с контекстом статьи.

1

В моей голове просто это очень похоже на ICompare/IComparable.

Реализация интерфейса означает, что поведение присуще реализующий класс. Поведение не изменяется в зависимости от вызывающего абонента или обстоятельств вызова.

Делегат говорит, что операция не присуща классу, но на основе контекста или вызывающего абонента, чтобы определить.

0

Эта формулировка кажется немного запутанной, но может быть проиллюстрирована примером. Предположим, что кто-то проектировал кнопочный элемент управления, который хотел бы предоставить уведомление, когда он был нажат. Обычная практика заключалась бы в том, чтобы кнопка поддерживала список делегатов для вызова. Если класс хотел бы, чтобы кнопка вызывала один из своих методов по самому экземпляру, он может легко построить делегат, который будет вызывать этот метод в этом экземпляре. Обратите внимание, что использование делегата для этой цели означает, что необходимо создать объект кучи для делегата в дополнение к экземпляру, метод которого должен вызвать делегат.

Альтернативным подходом было бы определить интерфейс INotifyOfButtonClick, с использованием метода NotifyOfButtonClick(), и иметь контроль кнопки, чтобы сохранить список INotifyButtonClick. Когда кнопка нажата, она будет вызывать NotifyOfButtonClick() для каждого экземпляра. Если в форме только одна кнопка, которая использует этот интерфейс, или если все такие кнопки используют один и тот же метод, форма может сама реализовать INotifyOfButtonClick() и добавить себя к списку подписки на кнопки (ов), вместо того, чтобы создавать отдельный делегат для вызова его метода. В сценариях, где этот подход работает, он может быть более эффективным, чем использование делегатов. Если в форме будут две кнопки, которые используют один и тот же интерфейс, но, однако, захотят вызывать разные методы, все усложняется. В этом случае было бы необходимо, чтобы форма создала новый объект, целью которого было реализовать INotifyOfButtonClick(), вызвав некоторый метод в форме, к которой он содержит ссылку. Использование таких объектов-оберток, вероятно, даст производительность, сопоставимую с делегатами, но без участия некоторых делегатов, получающих компилятор.

Кстати, если Microsoft может добавить к каждому делегату вложенный интерфейс IInvoke (таким образом, что, например, Action<int> будет определять интерфейс Action<int>.IInvoke), а затем, если методы, которые приняли Action<int> были переписаны, чтобы принять Action<int>.IInvoke, тогда объекты, только один метод которые собирались вызывать такие делегаты, могли просто перейти к таким методам. Такая особенность может повысить эффективность закрытия.

0

• Интерфейс определяет только один метод. • Требуется многоадресная передача. • Абоненту необходимо реализовать интерфейс несколько раз.

Смежные вопросы