Категории:

Астрономия
Биология
География
Другие языки
Интернет
Информатика
История
Культура
Литература
Логика
Математика
Медицина
Механика
Охрана труда
Педагогика
Политика
Право
Психология
Религия
Риторика
Социология
Спорт
Строительство
Технология
Транспорт
Физика
Философия
Финансы
Химия
Экология
Экономика
Электроника

Часть 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