Делегаты. Как созданные объекты могут посылать сообщения тем объектам, которые их породили? При программировании под Windows на С и C++ основное средство.

Slides:



Advertisements
Similar presentations
EXtreme Programming XP Тема 3. XP Пусть есть некоторая информационная система для банков. В качестве основной валюты для расчетов используется доллар,
Advertisements

Английский язык. Настоящее совершенное длительное время.
ЗАРЯДКА НА АНГЛИЙСКОМ ЯЗЫКЕ.  Зарядка на уроке английского языка может стать самым любимым и веселым занятием для детей, при том, что она проходит исключительно.
ООП Классы. Данные отдельно, методы отдельно struct Node { Node* next; void* data; }; struct List { Node* first; int size; }; void* allocate() { … } void.
PowerPoint Presentation for Dennis, Wixom & Tegarden Systems Analysis and Design Copyright 2001 © John Wiley & Sons, Inc. All rights reserved. Slide 1.
Тел. (495) Москва, а/я 212 Рабочая группа по реформе МВД Москва, 2010 Новикова Асмик, Фонд «Общественный вердикт»
Counter-Strike Go Долгачев Вадим Ф-051 Counter-Strike Counter-Strike – знаменитая и очень популярная игра, в неё играют несколько миллионов людей по.
Некомпенсаторное агрегирование и рейтингование студентов Авторы: Гончаров Алексей Александрович, Чистяков Вячеслав Васильевич. НФ ГУ ВШЭ 2010 год.
Bank ownership and lending behavior Alejandro Micco, Ugo Panizza Politicians and banks: Political influences on government-owned banks in emerging markets.
Учитель математики Кулакова Т.М. МОУ ООШ №15 г.о Новокуйбышевск Самарской области Сентябрь 2011г.
Преподаватель: Арутюнова Е. В. (ст.преп.) Выполнила: студентка 1 курс ФЖ Манаенкова Елена Москва, 2010.
Скриптовые языки на примере Perl. Языки программирования Скриптовые Программа (или ее бай-код) интерпретируется Зачастую более высокий уровень абстрагирования.
Обзор последних достижений биометрических методов аутентификации РусКрипто 2005.
ООП Классы – 2. Ссылки Ссылка – еще одно имя объекта. Используйте ссылки вместо указателя. Это более безопасно. Complex c(10,10); Complex c2& = c; c2+=10;
Блок 3. Семейства белков I. Множественное выравнивание Первый курс, весна 2008, А.Б.Рахманинова.
Язык JavaScript Скриптовый язык для выполнения на html-страницах.
ПОТОКИ Начальные сведения. Многопоточность Каждому традиционному приложению Win32 соответствует один (обычно) или несколько процессов (process). Процесс.
Введение в параллельные вычисления. Технология программирования MPI (день третий) Антонов Александр Сергеевич, к.ф.-м.н., н.с. лаборатории Параллельных.
Язык SmallTalk «Чистый» объектно- ориентированный язык.
Анатомия класса. Схожесть с др. языками   С# похож на язык Java в том, что он требует, чтобы вся программная логика была заключена в определения типов.
Основы цифровой обработки речевых сигналов. Общая схема процесса речеобразования x[n] – дискретные отсчеты сигнала возбуждения y[n] – дискретные отсчеты.
Growing Neural Gas Method Нейросетевой метод построения неструктурированных адаптивных сеток.
Apache Harmony или как сделать курсовую работу в рамках этого проекта Фурсов Михаил.
Сравнение различных методов хранения XML в реляционных базах данных и в разных системах. Нгуен Тхань Хуен- 545 группа Руководитель : Б.А. Новиков Рецензент:
 Нужно много различных протоколов связи  Каждый из них может реализовываться на разных платформах Современные сети Много устройств, компьютеров и сетей.
PHP как язык программирования. Типы данных логические величины int, integer – целые числа real, double, float – вещественные числа string – строки array.
Введение в параллельные вычисления. Технология программирования MPI (день второй) Антонов Александр Сергеевич, к.ф.-м.н., н.с. лаборатории Параллельных.
"The European Molecular Biology Open Software Suite"
Software & Services Group, Developer Products Division Copyright© 2010, Intel Corporation. All rights reserved. *Other brands and names are the property.
Контейнеры. Сортировка  Метод sort()  Интерфейс Comparable метод int compareTo(Object o) вызов: Arrays.sort(a)  Интерфейс Comparator метод int compare(Object.
ВЫЧИСЛЕНИЕ В ЛИСПЕ Функциональное программирование Григорьева И.В.
Синтаксис языка Java.
Пользовательские действия (custom actions) в JSP. JSTL.
Особенности языка JavaScript и его использования.
Наследование и полиморфизм. «Быть» или «Иметь» а так же «Точно» или «Как получится»
Коллекции. Пространство имен System.Collections Наиболее простой вариант набора элементов — это массив System. Array. Он уже обладает весьма полезными.
События. События Важная роль делегатов заключается в том, что на них основана модель событий С#. Применение событий вовсе не ограничено приложениями с.
Работа с массивами в C#.
Демидов А.В г. Операционные системы Лекция 4 Работа с файлами.
Управляемые провайдеры ADO.NET Подключение к базам данных.
Обработка исключений Гудов А.М., Завозкин С.Ю
Семафоры-счетчики POSIX Программирование с использованием POSIX thread library.
XML - расширенный язык разметки Моисеевой О. Макушиной Д. (eXtensible Markup Language)
ПОТОКИ Начальные сведения. Многопоточность Каждому традиционному приложению Win32 соответствует один (обычно) или несколько процессов (process). Процесс.
Новосибирск, 2004 (С) Всеволод Рылов, все права защищены 1 Основы программирования на языке Java Средства ООП Java.
Visual Basic 7 Объектно-ориентированный язык программирования.
Учитель Антонова О.Я. Учитель Антонова О.Я. Зерноградская поликлиника.
XML Схемы XML документов. XML Schema созданая Microsoft позволяет избавиться от DTD блоков. Основа – использование пространств имен и очень точная типизация.
Обработка исключений в C# Единая техника обнаружения ошибок времени выполнения и передачи информации о них.
«Отгадай символы Рождества»
Нескучное тестирование с pytest
Zend Engine изнутри Дмитрий Стогов. Немного истории Zend Engine была разработана в качестве ядра для PHP 4 Andi Gutmans и Zeev Suraski в 1999 PHP 5.0.
Writing Friendly Letters A Write On Activity. Friendly letters have five parts: 1. The Heading 2. The Salutation (greeting) 3. The Body (some paragraphs)
Язык программирования C#
ORM Паттерны. Repository Repository (хранилище) ― выступает в роли посредника между слоем домена и слоем отображения данных, предоставляя интерфейс в.
Saint Petersburg, 2011 Java Lecture Generics. Quiz ArrayList lst = new ArrayList(); Collection c = lst; lst.add("one"); lst.add(“two"); lst.add(“three");
1 Cool Branding ‘Cool’ with Audio Dmitry Kuzmenko КлевыйКлевая Клевый звук = Клевая игра Дмитрий Кузьменко Strategic Music.
What do you think of popular thing?
to be have/has been –ing: The Present Perfect Continuous образуется при помощи вспомогательного глагола to be в формах Present Perfect (have/has been)
Anekdot ANDROID CLUB Сегодня  Navigation Drawer  CardView  Calligraphy  TextToSpeech.
1) int i = int.Parse("99"); 2) delegate void IntMethodInvoker(uint x); 3) delegate double TwoLongsOp(long first, long second); 4) delegate string GetAString();
33) static void Main() { Action operations = MathOperations.MultiplyByTwo; operations += MathOperations.Square; ProcessAndDisplayNumber(operations, 2.0);
Захватывающее предложение по организации игры «Мафия» для event-агентств наши клиенты: тел.: сайт: (495)
OpenCL. #include int main() { cl_platform_id platform[10]; cl_uint num_platforms; clGetPlatformIDs(10, platform, &num_platforms); cl_int clGetPlatformIDs.
Jokes Jokes Jokes Teacher: Where's your text book? Student: At home. Teacher: What's it doing there? Student: Having a.
MIDDLE WARE TECHNOLOGIES
Chapter-7 S. NandaGopalan, BIT
Класс Object Макаревич Л. Г..
November CTP Андрей Коршиков MCP-клуб, Краснодар Декабрь 2009.
class PrintOnetoTen { public static void main(String args[]) {
Presentation transcript:

Делегаты

Как созданные объекты могут посылать сообщения тем объектам, которые их породили? При программировании под Windows на С и C++ основное средство для решения этой проблемы — это функция обратного вызова (callback function, или просто callback), которая основана на использовании указателей на функции в oпeративной памяти.

Делегаты Делегат выполняет те же действия, что и указатель на функцию, но способами гораздо более безопасными и лучше соответствующими принципам объектно- ориентированного программирования. Как и все в мире С#, делегат — это специальный класс. Любой делегат производится от единого базового класса — System.MulticastDelegate

Делегаты public delegate void PlayAcidHouse (object PaulQakenfold, int volume); На самом деле: public class PlayAcidHouse : System.MulticastDelegate { PlayAcidHouse(object target, int ptr); // Синхронный метод Invoke() public void virtual Invoke(object PaulOakenfold, int volume); // Асинхронная версия того же самого обратного вызова public virtual lAsyncResult Beginlnvoke (object PaulOakenfold, int volume, AsyncCallback cb, object o); public virtual void Endlnvoke(IAsyncResult result); }

Пример делегата // Класс Саг вновь изменился public class Car { // Новые переменные! private bool isDirty; // Испачкан ли наш автомобиль? private bool shouldRotate; // Нужна ли замена шин? // Конструктор с новыми параметрами public Car(string name, int max, int curr, bool dirty, bool rotate) {… isDirty = dirty; shouldRotate = rotate; } // Свойство для isDirty public bool Dirty { get { return isDirty; } set { isDirty = value;} } // Свойство для shouldRotate public bool Rotate {get { return shouldRotate; } set { shouldRotate = value; } }}

Пример делегата // Делегат - это класс, инкапсулирующий указатель на функцию. В нашем случае // этой функцией должен стать какой-то метод, принимающий в качестве параметра // объект класса Саг и ничего не возвращающий; public delegate void CarDelegate(Car с); Делегат может быть определен внутри другого класса // Помещаем определение делегата внутрь определения класса public class Car : Object ( // Теперь наш делегат получит служебное имя Car$CarDelegate, то есть станет // вложенным типом... public delegate void CarDelegate(Саг с);... }

Члены System.MulticastDelegate Таблица 5.2. Некоторые унаследованные члены делегатов Method - Это свойство возвращает имя метода, на который указывает делегат Target - Если делегат указывает на метод — член класса, то этот член возвращает имя этого класса. Если Target возвращает значение типа null, то делегат указывает на статический метод Combine() - Этот статический метод используется для создания делегата, указывающего на несколько разных функций GetlnvocationList() - Возвращает массив типов Delegate, каждый из которых представляет собой запись во внутреннем списке указателей на функции делегата Remove() - Этот статический метод удаляет делегат из списка указателей на функции

Применение CarDelegate // В классе Garage предусмотрен метод, принимающий CarDelegate в качестве параметра public class Garage { ArrayList theCars = new ArrayList(); // Набор машин в гараже public Garage() // Создаем объекты машин в гараже { theCars.Add(new car(“Viper“, 100, 0, true, false)); theCars.Add(new car("Fred“, 100, 0, false, false)); theCars.Add(new car("BillyBob“, 100, 0, false, true)); theCars.Add(new car(“Bart“, 100, 0, true, true)); theCars.Add(new car("Stan“, 100, 0, false, true)); }

Применение CarDelegate // Можно считать, что ргос - это эквивалент указателя на функцию public void ProcessCars(Car.CarDelegate proc) { // Интересно, а куда мы передаем наш вызов? Console.WriteLine(“***** Calling: {0} *****“, proc.Method.ToString()); // Еще одна проверка: вызываемый метод является статическим или обычным? if (proc. Target != null) Console. WriteLine("->Target: {0}“, proc.Target.ToString()): else Console. WriteLine("->Target Is a static method"); // Для чего это все затевалось: при помощи делегата вызываем метод // и передаем ему все объекты Саг foreach (car с in theCars) ргос(с); }

Применение CarDelegate // Гараж передает право выполнить всю работу этим статическим функциям - наверное, у него нет хороших механиков... public class CarApp { public static void WashCar(Car с) // Первый метод, на который будет указывать делегат {If (с.Dirty) { Console.WriteLine("Cleaning a car"); с.Dirty=false; } else Console.WriteLine("This car is already clean..."); ) public static void RotateTires(Car c) // Второй метод для делегата { if(c.Rotate) { Console.WriteLine(“Tires have been rotated"); c.Rotate=false; } else Console.WriteLine("Don't need to be rotated..."); } public static int Main(string[] args) { // Создаем объект Garage Garage g = new Garage(); // Моем все грязные машины g.ProcessCars(new Car.CarDelegate(WashCar)); II Меняем шины g.ProcessCars(new Car.CarDelegate (RotateTires)) ; return 0; }

Многоадресность Многоадресный делегат — это объект, который может содержать в себе сразу несколько указателей на функции. // Добавляем во внутренний список указателей делегата сразу два указателя на функции: public static int Main(string[] args) { // Создаем объект Garage Garage g = new Garage(): // Создаем два новых делегата Car.CarDelegate wash = new Car.CarDelegate(WashCar): Car.CarDelegate rotate = new Car.CarDelegate(RotateTires); // Чтобы объединить два указателя на функции в многоадресном делегате, // используется перегруженный оператор сложения (+). В результате создается новый // делегат, который содержит указатели на обе функции g.ProcessCars(wash + rotate); return 0: }

Многоадресность Изменяем функцию ProcessCars public void ProcessCars (CarDelegate proc) { // Куда мы передаем вызов? foreach (Delegate d in proc.GetInvocationList()) { Console.WriteLinet"***** Calling: " + d.method.ToString() + " *****");... }

Делегаты, указывающие на обычные функции // Статические функции перестали быть статическими и переместились // во вспомогательный класс public class ServiceDept { // Уже не статическая! public void WashCar(Car с) { if(c.Dirty) Console.WriteLine(“'Cleaning a car"); else Console.WnteLine(“This car is already clean...“); } // To же самое public void RotateTires(Car c) { If(c.Rotate) Console.WriteLine(“Tlres have been rotated"); else Console.WriteLine(“Don't need to be rotated..."); }

Делегаты, указывающие на обычные функции // Делегаты будут указывать на обычные методы класса ServiceDept public static int Main(string[] args) { // Создаем гараж Garage g = new Garage(); II Создаем отдел обслуживания ServlceDept sd = new ServiceDept(); // Гараж делегирует работу отделу обслуживания Car.CarDelegate wash = new Car.CarDelegate(sd.WashCar); Car.CarDelegate rotate = new Car.CarDelegate(sd.RotateTires); MulticastDelegate d = wash + rotate; // Обращаемся в гараж с просьбой сделать эту работу g.ProcessCars(Car.CarDelegate)d); return 0; }