Часть 2. События в языке Java

К лабораторной работе 2 по ООП

Часть 1. Делегаты и события в языке С#

Делегаты

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

//delegate void DelEv (object s, EventArgs args);

 

 

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

}

}

 

Задание

1) Выполнить приведённую программу с делегатами. Модифицировать её, дополнив классом со статической и обычной функцией и использовав делегаты с этими функциями.

 

2) Выполнить приведённые программы с событиями. Модифицировать их в соответствии с указаниями преподавателя.

 

3) Создать программу с одним источником и массивом приёмников. Обработчики приёмников должны выдать на консоль дополнительно к данным события также номер объекта источника и номер объекта приёмника.

 

4) Создать программу с массивом источников и одним приёмником. Обработчик приёмника должен выдать на консоль дополнительно к данным события также номер объекта источника и номер объекта приёмника.

 

5) Создать программу с массивом источников и массивом приёмников. Обработчики приёмников должны выдать на консоль дополнительно к данным события также номер объекта источника и номер объекта приёмника.

 

6) Создать программу, состоящую из источника и цепочки приёмников-источников, обеспечивающих передачу сообщений в соответствии с алгоритмом, указанным преподавателем.

 

Часть 2. События в языке Java