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

 

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

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

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

ленной логике вызова... Однако в традиционных С и C++ ничего подобного нет.
А в С# такое средство есть! Оно называется делегатом (delegate) и выполняет те же действия, что и указатель на функцию, но гораздо более безопасными и лучше соответствующими принципам объектно-ориентированного программирования способами. При создании делегата в С# указывается не только имя метода, но и бор передаваемых функции параметров (если они есть), и возвращаемое функції-
236 Глава 5 • Дополнительные возможности классов С#
ей значение. Как и все в мире С#, делегат — это специальный класс. Любой делегат производится от единого базового класса — System.MuI ticastDelegate с заранее определенным набором членов. Поэтому когда мы создаем новый делегат, например так:
public delegate void PiayAcioHouse-object PaulQakenfold. int volume):
в действительности в этот момент компилятор выполняет следующие команды по созданию нового класса:
public class PlayAcidHouse : System.MulticastD&legate
і
^ayAr:Housefobject target, int -т->: //Синхронный нетод Invoket)
public void virtual Invoke(object PaulOakenfold. int volume);
//Асинхронная версия того же самого обратного вызова public virtual IAsyncResult Beginlnvoke(object PaulOakenfold. int volume,
AsyncCallback cb, object о): public virtual void EndlnvokeCIAsyncResult result);
}
Тот класс, который был создан при создании делегата, содержит два открытых метода Invoke?) и Begmlnvokeu, первый из которых предназначен для синхронного вызова, а второй — для асинхронного. Пока мы рассмотрим только средства для синхронного вызова в MulicastDelegate.
Пример делегата
Чтобы рассмотреть применение делегата на практике, нам потребуется внести в наш класс Ca-' очередную порцию изменений. В этот раз мы добавим две новые переменные типа bool, Первая из них будет определять, является ли наш автомобиль грязным (переменная і sDi rty), а вторая - нуждается ли автомобиль в замене покрышек (shouldRotate). Чтобы пользователю было проще взаимодействовать с новыми данными, в Саг также будут добавлены дополнительные свойства и новый вариант конструктора:
// Класс Саг вновь изменился
public class Саг
(
Новые переменные!
private bool і sDi rty; // Испачкан ли наш автомобиль? private bool shouldRotate; // Нужна ли замена шин?
// Конструктор с новыми параметрами
public carCstring name, int max. int curr. bool dirty, bool rotate) і
isOirty - dirty: shouldRotate = rotate:
}
II Свойство для isDirty public bool Dirty
Делегаты 237
get { return isDirty: } set isDirty - value; }
}
II Свойство для shouldRotate
public bool Rotate
{ ¦
get { return shouldRotate: } set { shouldRotate = value: }
¦¦,
j
Теперь предположим, что мы объявили делегат в текущем пространстве имен следующим образом (вспомним, что делегат - это не более чем объектно-ориеи-тированная надстройка, в основе которой — тот же указатель на функцию):
// Делегат - это класс, инкапсулирующий указатель на функцию. В нашей случае этой
// функцией должен стать какой-то метод, принимающий в качестве параметра объект класса
// Саг и ничего не возвращающий;
public delegate void CarDelegate(Car с):
Если мы рассмотрим наше приложение при помощи ILDasm.exe, то мы обнар\ -жим новый класс CarDelegate, который является производным от MulticastDel egat9 (рис. 5.3).
/ D:\C5harpBoob\L<ibs\Chapter 5\СагОе1едо1е\Ьп\ОеЬид~.Я1яЮ
EJe Иен-
¦ D^CSharpBoo^LabsKhapter- 5\Csi-Debgate\b(i\Debug\Carr>elegate.exe а э CarDelegateApp к Щ. Саг
ffl-Щ
T
\ .class (NIr л ihn лглі <мілН__
CF- Г" extendi System. Multfc35tDeleaate~~J]
V ,ctor: vow aast sy stem. іч>оіеп, int ш ¦ • v BegWrrvoke : class['mscoriib']Systein.IAsyncResult(class CarC
V Endlnvoke ; vald(class ['msCurlib']System.lAsyncReSult) .....V Invoke : vokJfdass CarDelegateApp.Car)
іЦ Garage > MANIFEST
I _I_
Рис. 5.3. Делегат в C# — это класс, производный от MultJcastDelegate
Делегаты как вложенные типы
Сейчас созданный нами делегат существует отдельно от логически связанного с ним типа Саг (оба они определены непосредственно в пространстве имен). Однако делегат можно поместить и непосредственно внутрь определения класса Саг:
// Помещаем орсєлєпєііі'Є делегата анутрь определения класса public class Саг : Object (
// Теперь наш делегат получит служебное имя CarJcarDelegate Сто есть станет
// вложенный типом)
public delegate void CarDelegate(Car с):
І"
\
238 Глава 5 • Дополнительные возможности классов С#
Поскольку, как мы выяснили, делегат — это новый класс, производный от System. MuItіcastuelegate, у нас получился вложенный класс CarDelegate. Убедиться в справедливости этого утверждения можно при помощи ILDasm.exe (рис. 5.4).
Г D:\CSharpBonk\lab4\Chapter5\
0е yjew Help
у D:\CShaipBookMabs\Chapter 5\CaiDeleaete\birAD_; ? 9 CaiDelegateApp Н-ИДСаі
.. .сізаз public auto ansi
CaftC-a'D&c-ga'*
class «ju> ansi Mialsd netted publc extends iyzi em. Mu&astD&eje?« Я .ctof: void(ohss System Object.int32
¦ Beginlnvoke: class [mscorlib]Syslem.
¦ Endlrwoke YOidlclass [mscoilfalSyst H Invoke: void(class CaiDelegateAppT CartFt sio
Предыдущая << 1 .. 94 95 96 97 98 99 < 100 > 101 102 103 104 105 106 .. 320 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100