Разделы презентаций


1 © Павловская Т.А. (СПбГУ ИТМО) Делегаты

Содержание

©Павловская Т.А. (СПбГУ ИТМО)Определение делегата Делегат — это вид класса, предназначенный для хранения ссылок на методы. Делегат, как и любой другой класс, можно передать в качестве параметра, а затем вызвать инкапсулированный

Слайды и текст этой презентации

Слайд 1©Павловская Т.А. (СПбГУ ИТМО)
Делегаты

©Павловская Т.А. (СПбГУ ИТМО)Делегаты

Слайд 2©Павловская Т.А. (СПбГУ ИТМО)
Определение делегата
Делегат — это вид класса,

предназначенный для хранения ссылок на методы. Делегат, как и любой

другой класс, можно передать в качестве параметра, а затем вызвать инкапсулированный в нем метод.
Делегаты используются для поддержки событий, а также как самостоятельная конструкция языка.
Описание делегата задает сигнатуру методов, которые могут быть вызваны с его помощью:
[ атрибуты ] [ спецификаторы ] delegate тип имя([ параметры ])
Пример описания делегата:
public delegate void D ( int i );
Базовым классом делегата является класс System.Delegate
©Павловская Т.А. (СПбГУ ИТМО)Определение делегата Делегат — это вид класса, предназначенный для хранения ссылок на методы. Делегат,

Слайд 3©Павловская Т.А. (СПбГУ ИТМО)
Использование делегатов
Делегаты применяются в основном для

следующих целей:
получения возможности определять вызываемый метод не при компиляции, а

динамически во время выполнения программы;
обеспечения связи между объектами по типу «источник — наблюдатель»;
создания универсальных методов, в которые можно передавать другие методы (поддержки механизма обратных вызовов).
©Павловская Т.А. (СПбГУ ИТМО)Использование делегатов Делегаты применяются в основном для следующих целей:получения возможности определять вызываемый метод не

Слайд 4©Павловская Т.А. (СПбГУ ИТМО)
Обратный вызов (callback)

©Павловская Т.А. (СПбГУ ИТМО)Обратный вызов (callback)

Слайд 5©Павловская Т.А. (СПбГУ ИТМО)
Передача делегата через список параметров
namespace ConsoleApplication1

{
public delegate double Fun( double x );

// объявление делегата
class Class1 {
public static void Table( Fun F, double x, double b )
{ Console.WriteLine( " ----- X ----- Y -----" );
while (x <= b)
{ Console.WriteLine( "| {0,8} | {1,8} |", x, F(x));
x += 1; }
}
public static double Simple( double x ) { return 1; }

static void Main()
{ Table( Simple, 0, 3 );
Table( Math.Sin, -2, 2 ); // new Fun(Math.Sin)
Table( delegate (double x ){ return 1; }, 0, 3 );
}}}
©Павловская Т.А. (СПбГУ ИТМО)Передача делегата через список параметров namespace ConsoleApplication1 {  public delegate double Fun( double

Слайд 6©Павловская Т.А. (СПбГУ ИТМО)
Операции
Делегаты можно сравнивать на равенство и

неравенство. Два делегата равны, если они оба не содержат ссылок

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

Использование делегата имеет тот же синтаксис, что и вызов метода. Если делегат хранит ссылки на несколько методов, они вызываются последовательно в том порядке, в котором были добавлены в делегат.
©Павловская Т.А. (СПбГУ ИТМО)Операции Делегаты можно сравнивать на равенство и неравенство. Два делегата равны, если они оба

Слайд 7©Павловская Т.А. (СПбГУ ИТМО)
События

©Павловская Т.А. (СПбГУ ИТМО)События

Слайд 8©Павловская Т.А. (СПбГУ ИТМО)
Определение события
Событие — элемент класса, позволяющий ему

посылать другим объектам (наблюдателям) уведомления об изменении своего состояния.
Чтобы

стать наблюдателем, объект должен иметь обработчик события и зарегистрировать его в объекте-источнике

©Павловская Т.А. (СПбГУ ИТМО)Определение событияСобытие — элемент класса, позволяющий ему посылать другим объектам (наблюдателям) уведомления об изменении

Слайд 9©Павловская Т.А. (СПбГУ ИТМО)
Пример
class Subj {

// -------------- Класс-источник события ---------------------
public

event EventHandler Oops; // Описание события станд. типа
public void CryOops() { // Метод, инициирующий событие
Console.WriteLine( "OOPS!" ); if ( Oops != null ) Oops( this, null ); }
}
class Obs { // --------------- Класс-наблюдатель --------------------------
public void OnOops( object sender, EventArgs e ) { // Обработчик соб-я
Console.WriteLine( «Оййй!" );
}
}
class Class1 {
static void Main() {
Subj s = new Subj();
Obs o1 = new Obs(); Obs o2 = new Obs();
s.Oops += o1.OnOops; // регистрация обработчика
s.Oops += o2.OnOops; // регистрация обработчика
s.CryOops();
}
}

OOPS!
Оййй!
Оййй!

©Павловская Т.А. (СПбГУ ИТМО)Примерclass Subj {      // -------------- Класс-источник события ---------------------

Слайд 10©Павловская Т.А. (СПбГУ ИТМО)
Механизм событий
События построены на основе делегатов: с

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

состоит из следующих частей:
описание делегата, задающего сигнатуру обработчиков событий;
описание события;
описание метода (методов), инициирующих событие.
Синтаксис события:
[ атрибуты ] [ спецификаторы ] event тип имя
©Павловская Т.А. (СПбГУ ИТМО)Механизм событийСобытия построены на основе делегатов: с помощью делегатов вызываются методы-обработчики событий. Поэтому создание

Слайд 11©Павловская Т.А. (СПбГУ ИТМО)
Пример
public delegate void Del( object o

); // объявление делегата
class A
{
public event

Del Oops; // объявление события
...
}
©Павловская Т.А. (СПбГУ ИТМО)Пример public delegate void Del( object o );   // объявление делегатаclass A{

Слайд 12©Павловская Т.А. (СПбГУ ИТМО)
Обработка событий выполняется в классах-получателях сообщения. Для

этого в них описываются методы-обработчики событий, сигнатура которых соответствует типу

делегата. Каждый объект (не класс!), желающий получать сообщение, должен зарегистрировать в объекте-отправителе этот метод.
Событие — это удобная абстракция для программиста. На самом деле оно состоит из закрытого статического класса, в котором создается экземпляр делегата, и двух методов, предназначенных для добавления и удаления обработчика из списка этого делегата.
Внешний код может работать с событиями единственным образом: добавлять обработчики в список или удалять их, поскольку вне класса могут использоваться только операции += и -=. Тип результата этих операций — void, в отличие от операций сложного присваивания для арифметических типов. Иного способа доступа к списку обработчиков нет.
©Павловская Т.А. (СПбГУ ИТМО)Обработка событий выполняется в классах-получателях сообщения. Для этого в них описываются методы-обработчики событий, сигнатура

Слайд 13©Павловская Т.А. (СПбГУ ИТМО)
Пример
public delegate void Del();

// объявление

делегата
class Subj // класс-источник
{ public event Del Oops; // объявление события
public void CryOops() // метод, инициирующий событие
{ Console.WriteLine( "OOPS!" ); if ( Oops != null ) Oops(); }
}
class ObsA // класс-наблюдатель
{
public void Do(); // реакция на событие источника
{ Console.WriteLine( "Вижу, что OOPS!" ); }
}
class ObsB // класс-наблюдатель
{
public static void See() // реакция на событие источника
{ Console.WriteLine( "Я тоже вижу, что OOPS!" ); }
}
©Павловская Т.А. (СПбГУ ИТМО)Примерpublic delegate void Del();

Слайд 14©Павловская Т.А. (СПбГУ ИТМО)
class Class1
{

static void Main()
{

Subj s = new Subj(); // объект класса-источника
ObsA o1 = new ObsA(); // объекты
ObsA o2 = new ObsA(); // класса-наблюдателя
s.Oops += new Del( o1.Do ); // добавление
s.Oops += new Del( o2.Do ); // обработчиков
s.Oops += new Del( ObsB.See ); // к событию
s.CryOops(); // инициирование события
}
}

©Павловская Т.А. (СПбГУ ИТМО)class Class1  {    static void Main()    {

Слайд 15©Павловская Т.А. (СПбГУ ИТМО)
Еще немного про делегаты и события
Делегат можно

вызвать асинхронно (в отдельном потоке), при этом в исходном потоке

можно продолжать вычисления.
Анонимный делегат (без создания класса-наблюдателя):
s.Oops += delegate ( object sender, EventArgs e )
{ Console.WriteLine( "Я с вами!" ); };
Делегаты и события обеспечивают гибкое взаимодействие взаимосвязанных объектов, позволяющее поддерживать их согласованное состояние.
События включены во многие стандартные классы .NET, например, в классы пространства имен Windows.Forms, используемые для разработки Windows-приложений.
©Павловская Т.А. (СПбГУ ИТМО)Еще немного про делегаты и событияДелегат можно вызвать асинхронно (в отдельном потоке), при этом

Обратная связь

Если не удалось найти и скачать доклад-презентацию, Вы можете заказать его на нашем сайте. Мы постараемся найти нужный Вам материал и отправим по электронной почте. Не стесняйтесь обращаться к нам, если у вас возникли вопросы или пожелания:

Email: Нажмите что бы посмотреть 

Что такое TheSlide.ru?

Это сайт презентации, докладов, проектов в PowerPoint. Здесь удобно  хранить и делиться своими презентациями с другими пользователями.


Для правообладателей

Яндекс.Метрика