Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Троелсен Э. -> "С# и платформа .NET. Библиотека программиста" -> 103

С# и платформа .NET. Библиотека программиста - Троелсен Э.

Троелсен Э. С# и платформа .NET. Библиотека программиста — СПб.: Питер, 2004. — 796 c.
ISBN 5-318-00750-3
Скачать (прямая ссылка): cplatforma2004.pdf
Предыдущая << 1 .. 97 98 99 100 101 102 < 103 > 104 105 106 107 108 109 .. 320 >> Следующая

Car.CarDelegate rotate = new Car.CarOelegate(RotateTires):
Делегаты 243
II Передаем комбинированный делегат методу ProcessCarsО g.ProcessCars'(Car.CarDelegate)d):
Вне зависимости от того, как именно мы создали многоадресный делегат, ueof: -ходимо запомнить главное: добавление во внутреннюю таблицу нового указателя на функцию производится при помощи метода Сотої ге;; (или перегруженного оператора +), а удаление — при помощи статического метода Remove (). Первый параметр метода Remove') определяет делегат, с которым производится операция, а зте-рой — тот указатель, который должен быть удален:
// Сіагический метод Remove О аозврзвае* новый делегат - с удаленной записью
// в таблице указателей на функции
Delegate wasriQnly - MuIticastDelegate.Remove'd. rotate);
9.ProcessCars((CarDelegateJwashOnly):
Перед тем как запуститы юл у ч єни v ю программу на выполнение, мы вначале об не -вим ProcessCars () таким образом^ чтобы при помощи метода Del egate. GetlnvocationLi st () вывести на консоль все указатели на функции, хранящиеся во внутренней це. Этот метод возвращает массив объектов Delegate, которые мы выведем на консоль, используя конструкцию foreach:
// Выводим каждый член во внутренней таблице функций
public void ProcessCars (CarDelegate ргос)
{
// Куда мы передаем вызов?
foreach(Delegate d in proc.GetlnvocationUstO)
t
Console.WriteLine'"***** Calling: " + d.method.ToStringO + " *****");
]
if
Результат выполнения нашей программы представлен на рис. 5.6.
V-. - --і. ¦ ¦ ¦ у '¦¦ .¦-.I » , CarDel^at^\bin\D5b«?4C«rDePef]!ete.eKe MtSfIS
им** к Calling: Uo id MashCar CCarDe leyateftpp-Саг> я^ммм ****** Calling: Uoid RotateTires <C^rDeleyateftpp.Car> ***** — >Target is a static nethad Cleaning a car Don *t need to be rotated.„_ This car is already clean... Don't need to be rotated... This car is already с lean,.. 1 ires have been rotated Cleaning a car Tires haue been rotated This car is already clean. . . TIi1GE haue been rotated
І Vt.-- .И> V I:*: у to <- її 'И .p піп-
Рис. 5.6. Применение многоадресного делегата
J
f
Делегаты, указывающие на обычные функции
Во всех примерах, которые были приведены выше, делегаты указывали только на статические функции. Однако это совершенно не обязательно — мы вполне можем создавать делегаты, указывающие на самые обычные функции, вызов которых производится через объект класса. Для того чтобы показать это на примере,
244 Глава 5
Дополнительные возможности классов
мы переместим наши функции WashCerC) и RotateTI в новый класс ServlceDept (отдел обслуживания);
// Статические функции перестали быть статическими и переместились // во вспомогательный класс
¦public class ServlceDept
{
//Уже не статическая! public void WashCar(Car с) {
1f(c.Dirty)
Ссчзз'е VnteLlner'Clsamric a «O:
else
Console. WriteLi net "This car is already clean.
Il To же самое
public void RotateTirestCar c)
{
if(c.Rotate)
CerKOle.tfritetirwCIires have been roteted"):
else
Console.WritetineC'Don't need to be rotated..
D:\CSharpBonk\Labs\chapter 5VCarDelegate\bin\Debuq\CarDelegate.ene HBB
»»tum Calliny: Uoid IfashCav <CarDeleaatenpp.Car> •*•»»
»»»»• Calling; Uoid RotateTires <Carl)elegatefipp-Cdr > .....
— >Taryet - CarDulegateflpp.SeruiceDept
Cleaning a car
Don't 111; e < I to he rotated...
This car is already clean...
Don't need to be rotated...
This car is ,і In-.ніV clean...
Tires have been rotated
Cleaning a car
Tires ltaue been rotated
This car is already clean...
Tires haue been rotated
Press any key to continue
ІЗ-
РИЄ. 5.7. Делегируем обычным методам
Теперь мы можем обновить наше приложение следующим образом:
// Делегаты будут указывать на обычные методы класса ServiceDept
public static int Maintstring[] args)
і
// Создаем гараж Garage g = new Ga rage u;
// Создаем отдел обслуживания ServlceDept sd = new ServiceDeptf);
II Гараж делегирует работу отделу обслуживания Car.CarDelegate wash = new Car.CarDelegate(sd.WashCar): Car.CarDelegate rotate - new Car.CarDelegate(sd.RotateTires); MulticastDelegatE d = wash + rotate;
//Обращаемся в гараж с просьбой сделать эту работу
События 245
g.ProcessCa rs(ССаг.CarDelegate)d): return 0;
}
To, что должно получиться, представлено на рис. 5.7 — обратите внимание на имя вызываемого метода.
Код приложения CarDelegate можно найти в подкаталоге Chapter 5.
События
Делегаты — это, безусловно, очень полезная синтаксическая конструкция С#, которая позволяет определять имя вызываемой функции во время выполнения, а не при компиляции. Однако еще более важная роль делегатов заключается в том, что на них основана модель событий С#.
Чаще всего события (events) используются в приложениях под Windows с графическим интерфейсом пользователя, в которых такие элементы управления, как Button (кнопка) или Calendar (календарь), реагируя на события, выдают информацию на той же панели, где они расположены. В качестве примера такого события можно привести, например, щелчок мышью на кнопке. Однако применение событий вовсе не ограничено приложениями с графическим интерфейсом — они могут быть исключительно полезными и в обычных консольных программах, как мы убедимся в наших примерах.
Предыдущая << 1 .. 97 98 99 100 101 102 < 103 > 104 105 106 107 108 109 .. 320 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100