он.

Применение методов экземпляра в качестве делегатов

В предыдущем примере использовались статические методы, но делегат может ссылаться и на методы экземпляра, хотя для этого требуется ссылка на объект. Так, ниже приведен измененный вариант предыдущего примера, в котором операции со строками инкапсулируются в классе StringOps. Следует заметить, что в данном случае может быть также использован синтаксис группового преобразования методов.

// Делегаты могут ссылаться и на методы экземпляра.

using System;

// Объявить тип делегата, delegate string StrMod(string str);

class StringOps {

// Заменить пробелы дефисами.

public string ReplaceSpaces(string s) {

Console.WriteLine('Замена пробелов дефисами.'); return s.Replace(' '-');

}

// Удалить пробелы.

public string RemoveSpaces(string s) { string temp = ''; int i;

Console.WriteLine('Удаление пробелов.'); for(i=0; i < s.Length; i++) if(s[i] != '    ')    temp    +=    s[i ] ;

return temp;

}

// Обратить строку, public string Reverse(string s) { string temp = ''; int i, j;

Console.WriteLine('Обращение строки.'); for(j=0, i=s.Length-1; i >= 0; i—, j++) temp += s [i];

return temp;

}

}

class DelegateTest { static void Main() {

StringOps so = new StringOpsO; // создать экземпляр

// объекта класса StringOps

// Инициализировать делегат.

StrMod strOp = so.ReplaceSpaces; string str;

// Вызвать методы с помощью делегатов, str = strOp('Это простой тест.');

Console.WriteLine('Результирующая строка: ' + str);

Console.WriteLine();

strOp = so.RemoveSpaces;

str = strOp('Это простой тест.');

Console.WriteLine('Результирующая строка: ' + str);

Console.WriteLine();

strOp = so.Reverse;

str = strOp('Это простой тест.');

Console.WriteLine('Результирующая строка: ' + str);

}

}

Результат выполнения этого кода получается таким же, как и в предыдущем примере, но на этот раз делегат обращается к методам по ссылке на экземпляр объекта класса StringOps.

Групповая адресация

Одним из самых примечательных свойств делегата является поддержка групповой адресации. Попросту говоря, групповая адресация — это возможность создать список, или цепочку вызовов, для методов, которые вызываются автоматически при обращении к делегату. Создать такую цепочку нетрудно. Для этого достаточно получить экземпляр делегата, а затем добавить методы в цепочку с помощью оператора + или +=. Для удаления метода из цепочки служит оператор - или -=. Если делегат возвращает значение, то им становится значение, возвращаемое последним методом в списке вызовов. Поэтому делегат, в котором используется групповая адресация, обычно имеет возвращаемый тип void.

Ниже приведен пример групповой адресации. Это переработанный вариант предыдущих примеров, в котором тип значений, возвращаемых методами манипулирования строками, изменен на void, а

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату