Допустим, у нас есть делегация C #, подобная этой:
delegate int Calculate(int x, int y);
Преимущество здесь в том, что когда метод foo
ожидает делегирование Calculate
в своем параметре, например:
void foo(Calculate calculate)
{
var result = calculate(1, 2);
// ...
}
Мы можем легко передать любой метод , который соответствует подписи делегирования, в foo
. Например, если у нас уже есть метод sum
класса Math
, мы можем просто вызвать foo
следующим образом:
foo(mathObject.sum);
Без делегирования, как в Java, мы должны сделать Calculate
интерфейсом, а класс Math
реализует Calculate
. Если нам не разрешено изменять исходный код класса Math
, мы должны написать адаптер (шаблон проектирования адаптера). Это много дополнительной работы.