Часть 2. События в языке Java. К лабораторной работе 2 по ООП
К лабораторной работе 2 по ООП
Часть 1. Делегаты и события в языке С#
Делегаты
Создать объект делегата и выполнить его
using System;
// Объявить делегат
delegate void DelF ();
class TestDel
{
void F (){Console.WriteLine ("F");}
static void Main ()
{
// Создать объект типа TestDel
TestDel tD= new TestDel();
// Создать объект dF делегата DelF с функцией F()
DelF dF= new DelF (tD.F);
// Выполнить объект делегата dF
dF();
}
}
Задание
1) Выполнить приведённую программу с делегатом. Модифицировать её, дополнив класс функциями различных форматов. Создать делегаты для этих функций и выполнить их.
Создать объект делегата, размещённого в классе, и выполнить его
А) инициализировать делегат вне класса
using System;
// Объявить делегат
delegate void DelF ();
class A
{
public DelF delF=null; // Ссылка на делегат
}
class B
{
public void F (){Console.WriteLine ("F");}
static void Main ()
{
B b= new B();
// Выполнить функцию F() класса B
b.F();
// Создать объект a типа A с указанным делегатом
A a= new A();
// Инициализировать делегат a.delF функцией F() класса B
a.delF= new DelF(b.F);
// Выполнить делегат delF класса А
a.delF();
}
}
А) инициализировать делегат внутри класса
using System;
// Объявить делегат
delegate void DelF ();
class A
{
public DelF delF; // Ссылка на делегат
public A()
{ // инициализировать объект делегата
delF= new DelF(this.F);
}
// Функция без параметров
public void F (){Console.WriteLine ("F");}
}
class B
{
static void Main ()
{
A a= new A(); // Создать объект a типа A
// Выполнить делегат delF класса А
a.delF();
}
}
А) передать делегат в класс через конструктор
using System;
// Объявить делегат
delegate void DelF ();
class A
{
public DelF delF=null; // Ссылка на делегат
public A(DelF d)
{ // Добавить в делегат delF делегат
// с ннкапсулированной функцией
delF+= d;
}
}
class B
{
public void F (){Console.WriteLine ("F");}
static void Main ()
{
B b= new B();
DelF dF= new DelF(b.F);
// Создать объект a типа A с указанным делегатом
A a= new A(dF);
// Выполнить делегат delF класса А
a.delF();
}
}
.//////////////
using System;
// Объявить два делегата
delegate int DelRet (int x, int y);
delegate void DelRef (int x, int y,ref int z );
class TestDel
{
static void Main ()
{
TestDel tD= new TestDel(); // Создать объект типа TestDel
// Создать объект делегата DelRet с функцией SumRet
DelRet tRet= new DelRet (tD.SumRet);
// Выполнить объект делегата tRet
Console.WriteLine ("4+5= " + tRet(4, 5));
//DelRet tRet1= new DelRet(tD.SumRef); // Ошибка
// Создать объект делегата DelRef с функцией SumRef
DelRef tRef= new DelRef (tD.SumRef);
// Выполнить объект делегата tRet
int z=0;
tRef (10, 20, refz);
Console.WriteLine ("10+20= " + z);
// Выполнить функцию UseDel с делегатами DelRet и DelRef
Console.WriteLine ("(11+12)+(100+200)= " + tD.UseDel(tRet, tRef));
}
int SumRet (int a, int b){return a+b;}
void SumRef (int a, int b, ref int c){c= a+b;}
int UseDel (DelRetdR, DelRef dF)
{
int tmp= 0;
dF (11,22, ref tmp);
return tmp+dR (100,200);
}
}
События
1. Событие и обработчик в одном классе (источник является и приёмником)
using System;
// Делегат события
delegate void DelEv (int x, string s);
class TestEv
{
public event DelEv ev; // Ссылка на объект события
static void Main ()
{
TestEv tE= new TestEv (); //Создать объект типа TestEv
// Подписать обработчик на событие ev
tE.ev +=new DelEv (tE.Handler);
// Генерировать событие
tE.ev (4,"four");
}
// Обработчик события
void Handler (int a, string b)
{
Console.WriteLine ("a= " + a + " b= "+ b);
}
}
2. Событие и обработчик в разных классах (источник отделён от приёмника)
using System;
// Делегат события
delegate void DelEv (int x, string s);
class Source // Класс источника события
{
public event DelEv ev; // Ссылка на объект события
// Функция генерирования события
public void Fire (int x, string s)
{
if(ev != null) ev (x, s);
}
}
class Receiver // Класс приёмника события
{
// Обработчик события
public void Handler (int a, string b)
{
Console.WriteLine ("a= " + a + " b= "+ b);
}
}
class TestEv
{
static void Main ()
{
Source s= new Source (); // Создать источник события
Receiver r= new Receiver (); // Создать приёмник события
// Подписать обработчик на событие ev
s.ev +=new DelEv (r.Handler);
// Генерировать событие
s.Fire (5,"five");
}
}
Событие с объектом данных
using System;
// Делегат события
delegate void DelEv (int x, string s);
class OurEventArgs: EventArgs // Класс данных события
{
private int x;
private String s;
public OurEventArgs (int X, String S)
{x= X; s= S;}
public int X {get{return x;}}
public String S{get{return s;}}
}
class Source
{
public event EventHandler ev; // Ссылка на объект события
// Функция генерирования события
public void Fire (int x, string s)
{
// Создать объект данных события
OurEventArgs oE= new OurEventArgs (x, s);
// Сгенерировать событие
if(ev != null) ev (this, oE);
}
}
class Receiver
{
// Обработчик события
public void Handler (object sender, EventArgs oE)
{
// Получить объект данных события
OurEventArgs oea= (OurEventArgs)oE;
Console.WriteLine ("a= " + oea.X + " b= "+ oea.S);
}
}
class TestEv
{
static void Main ()
{
Source s= new Source (); // Создать источник события
Receiver r= new Receiver (); // Создать приёмник события
// Подписать обработчик на событие ev
s.ev +=new EventHandler (r.Handler);
// Генерировать событие
s.Fire (5,"five");
}
}
Задание
2) Выполнить приведённую программу с делегатами. Модифицировать её, дополнив классом со статической и обычной функцией и использовав делегаты с этими функциями.
3) Выполнить приведённые программы с событиями. Модифицировать их в соответствии с указаниями преподавателя.
4) Создать программу с одним источником и массивом приёмников. Обработчики приёмников должны выдать на консоль дополнительно к данным события также номер объекта источника и номер объекта приёмника.
5) Создать программу с массивом источников и одним приёмником. Обработчик приёмника должен выдать на консоль дополнительно к данным события также номер объекта источника и номер объекта приёмника.
6) Создать программу с массивом источников и массивом приёмников. Обработчики приёмников должны выдать на консоль дополнительно к данным события также номер объекта источника и номер объекта приёмника.
7) Создать программу, состоящую из источника и цепочки приёмников-источников, обеспечивающих передачу сообщений в соответствии с алгоритмом, указанным преподавателем.
Часть 2. События в языке Java