Курс «С#. Программирование на языке высокого уровня» Павловская Т. А




НазваниеКурс «С#. Программирование на языке высокого уровня» Павловская Т. А
Дата конвертации13.03.2013
Размер445 b.
ТипЛекция


Курс «С#. Программирование на языке высокого уровня»

  • Павловская Т.А.


Лекция 9. Интерфейсы. Контейнерные классы

  • Описание и использование интерфейсов. Применение стандартных интерфейсов .NET для сравнения, перебора, сортировки и клонирования объектов. Понятие контейнера (коллекции). Использование стандартных коллекций .NET.



  • Делегаты



Определение делегата

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

  • Делегаты используются для поддержки событий, а также как самостоятельная конструкция языка.

  • Описание делегата задает сигнатуру методов, которые могут быть вызваны с его помощью:

  • [ атрибуты ] [ спецификаторы ] delegate тип имя([ параметры ])

  • Пример описания делегата:

  • public delegate void D ( int i );

  • Базовым классом делегата является класс System.Delegate



Использование делегатов

  • Делегаты применяются в основном для следующих целей:

    • получения возможности определять вызываемый метод не при компиляции, а динамически во время выполнения программы;
    • обеспечения связи между объектами по типу «источник — наблюдатель»;
    • создания универсальных методов, в которые можно передавать другие методы (поддержки механизма обратных вызовов).


Обратный вызов (callback)



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

  • 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 );

  • }}}



Операции

  • Делегаты можно сравнивать на равенство и неравенство. Два делегата равны, если они оба не содержат ссылок на методы или если они содержат ссылки на одни и те же методы в одном и том же порядке.

  • С делегатами одного типа можно выполнять операции простого и сложного присваивания.

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

  • Использование делегата имеет тот же синтаксис, что и вызов метода. Если делегат хранит ссылки на несколько методов, они вызываются последовательно в том порядке, в котором были добавлены в делегат.



  • События



Определение события

  • Событие — элемент класса, позволяющий ему посылать другим объектам (наблюдателям) уведомления об изменении своего состояния.

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



Пример

  • 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();

  • }

  • }



Механизм событий

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

    • описание делегата, задающего сигнатуру обработчиков событий;
    • описание события;
    • описание метода (методов), инициирующих событие.
  • Синтаксис события:

  • [ атрибуты ] [ спецификаторы ] event тип имя



Пример

  • public delegate void Del( object o ); // объявление делегата

  • class A

  • {

  • public event Del Oops; // объявление события

  • ...

  • }



  • Обработка событий выполняется в классах-получателях сообщения. Для этого в них описываются методы-обработчики событий, сигнатура которых соответствует типу делегата. Каждый объект (не класс!), желающий получать сообщение, должен зарегистрировать в объекте-отправителе этот метод.

  • Событие — это удобная абстракция для программиста. На самом деле оно состоит из закрытого статического класса, в котором создается экземпляр делегата, и двух методов, предназначенных для добавления и удаления обработчика из списка этого делегата.

  • Внешний код может работать с событиями единственным образом: добавлять обработчики в список или удалять их, поскольку вне класса могут использоваться только операции += и -=. Тип результата этих операций — void, в отличие от операций сложного присваивания для арифметических типов. Иного способа доступа к списку обработчиков нет.



Пример

  • 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!" ); }

  • }



  • 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(); // инициирование события

  • }

  • }



Еще немного про делегаты и события

  • Делегат можно вызвать асинхронно (в отдельном потоке), при этом в исходном потоке можно продолжать вычисления.

  • Анонимный делегат (без создания класса-наблюдателя):

  • s.Oops += delegate ( object sender, EventArgs e )

  • { Console.WriteLine( "Я с вами!" ); };

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

  • События включены во многие стандартные классы .NET, например, в классы пространства имен Windows.Forms, используемые для разработки Windows-приложений.



Похожие:

Курс «С#. Программирование на языке высокого уровня» Павловская Т. А iconКурс «С#. Программирование на языке высокого уровня» Павловская Т. А
Лекция Интерфейсы. Контейнерные классы Описание и использование интерфейсов. Применение стандартных интерфейсов. Net для сравнения,...
Курс «С#. Программирование на языке высокого уровня» Павловская Т. А iconПрограммирование на языке высокого уровня Для студентов очно-заочной формы обучения

Курс «С#. Программирование на языке высокого уровня» Павловская Т. А iconВладимир Биллиг профессор кафедры информатики Тверского госуниверситета Курс «Офисное программирование»
Программирование в среде, представимой в виде совокупности объектов, на встроенном языке, позволяющем работать с объектами среды
Курс «С#. Программирование на языке высокого уровня» Павловская Т. А iconПрограммирование на языке Паскаль Часть II массивы

Курс «С#. Программирование на языке высокого уровня» Павловская Т. А iconЛитература на русском языке. Кроме того, курс предполагает выполнения творческих письменных заданий на испанском языке, что ведет к развитию творческого потенциала учащихся
Целью курса является формирование у учащихся навыков осознанного познавательного чтения оригинальной художественной литературы на...
Курс «С#. Программирование на языке высокого уровня» Павловская Т. А iconМоу «Павловская сош» моу «Павловская сош»
«Разработка модели социально-педагогического партнерства на основе межведомственного взаимодействия учреждений социальной сферы в...
Курс «С#. Программирование на языке высокого уровня» Павловская Т. А iconЗдоровый образ жизни
Зож предполагает обеспечение высокого уровня трудоспособности, достижение активного долголетия каждым членом нашего общества
Курс «С#. Программирование на языке высокого уровня» Павловская Т. А iconОсновы объектно-ориентированного программирования (ооп) программирование возникло и развивалось как процедурное программирование
«шаблонами», определяющими наборы свойств, методов и событий, по которым создаются объекты
Курс «С#. Программирование на языке высокого уровня» Павловская Т. А iconСодержание Состояние предметной области
Линейное и целочисленное линейное программирование Часть Нелинейное программирование и многоэкстремальная оптимизация
Курс «С#. Программирование на языке высокого уровня» Павловская Т. А iconКурс «информатика» 2012/2013 Учебный год
Разрабатывать программу на языке программирования в соответствии с созданным алгоритмом
Разместите кнопку на своём сайте:
hnu.docdat.com


База данных защищена авторским правом ©hnu.docdat.com 2012
обратиться к администрации
hnu.docdat.com
Главная страница