Чтение онлайн

на главную

Жанры

Интернет-журнал "Домашняя лаборатория", 2007 №9
Шрифт:

public event FireEventHandler Fire;

//моделирование случайных событий

private Random rnd = new Random;

//вероятность пожара в доме в текущий день: р= m/n

private int m = 3, n= 10000;

В нашем городе есть дома; есть время, текущее день за днем; городские службы; событие "пожар", которое, к сожалению, может случайно с заданной вероятностью возникать каждый день в каждом доме. Рассмотрим конструктор объектов нашего класса:

//конструктор класса

public NewTown(int TownSize, int Days)

{

BuildingNumber = rnd.Next(TownSize);

days = Days;

policeman = new Police (this);

ambulanceman= new Ambulance (this);

fireman= new FireDetect (this);

policeman.On ;

ambulanceman.On ;

fireman.On ;

}

При

создании объектов этого класса задается размер города — число его домов и период времени, в течение которого будет моделироваться жизнь города. При создании объекта создаются его службы — объекты соответствующих классов Police, Ambulance, FireDetect, которым передается ссылка на сам объект "город". При создании служб вызываются методы On, подключающие обработчики события Fire каждой из этих служб к событию.

В соответствии с ранее описанной технологией определим метод OnFire, включающий событие:

protected virtual void OnFire(FireEventArgs e)

{

if(Fire!= null)

Fire(this, e);

}

Где и когда будет включаться событие Fire? Напишем метод, моделирующий жизнь города, где для каждого дома каждый день будет проверяться, а не возник ли пожар, и, если это случится, то будет включено событие Fire;

public void LifeOurTown

{

for(day = 1; day<=days; day++)

for(build =1; build <= BuildingNumber; build++)

{

if(rnd.Next(n) <=m) //загорелся дом

{

//аргументы события

FireEventArgs е = new FireEventArgs(build, day, true);

OnFire(e);

if(e.Permit)

Console.WriteLine("Пожар потушен!" +

" Ситуация нормализована.");

else Console.WriteLine("Пожар продолжается." +

" Требуются дополнительные средства!");

}

}

}

Рассмотрим теперь классы Receiver, обрабатывающие событие Fire. Их у нас три, по одному на каждую городскую службу. Все три класса устроены по одному образцу. Напомню, каждый такой разумно устроенный класс, кроме обработчика события, имеет конструктор, инициализирующий ссылку на объект, создающий события, методы подключения и отсоединения обработчика от события. В такой ситуации целесообразно построить вначале абстрактный класс Receiver, в котором будет предусмотрен обработчик события, но не задана его реализация, а затем для каждой службы построить класс-потомок. Начнем с описания родительского класса:

public abstract class Receiver

{

private NewTown town;

public Receiver(NewTown town)

{this.town = town;}

public void On

{

town.Fire += new FireEventHandler(It_is_Fire);

}

public void Off

{

town.Fire — = new FireEventHandler(It_is_Fire);

town = null;

}

public abstract void It_is_Fire(object sender,

FireEventArgs e);

}//class Receiver

Для

классов потомков абстрактный метод It_is_Fire будет определен. Вот их описания:

public class Police: Receiver

{

public Police (NewTown town): base(town){}

public override void It_is_Fire(object sender,

FireEventArgs e)

{

Console.WriteLine("Пожар в доме {0}. День {1}-й. "

+ " Милиция ищет виновных!", е. Build,е. Day);

е. Permit &= true;

}

}// class Police

public class FireDetect: Receiver

{

public FireDetect (NewTown town): base(town){}

public override void It_is_Fire(object sender, FireEventArgs e)

{

Console.WriteLine("Пожар в доме {0}. День {1}-й."+

" Пожарные тушат пожар!", е. Build,е. Day);

Random rnd = new Random(e.Build);

if(rnd.Next(10) >5)

e. Permit &= false;

else e.Permit &=true;

}

}// class FireDetect public class Ambulance: Receiver

{

public Ambulance(NewTown town): base(town){}

public override void It_is_Fire(object sender,

FireEventArgs e)

{

Console.WriteLine("Пожар в доме {0}. День {1}-й."+

" Скорая спасает пострадавших!", е. Build,е. Day);

е. Permit &= true;

}

}// class Ambulance

Для каждого потомка задан конструктор, вызывающий базовый метод родителя. Каждый потомок по-своему определяет обработчика события Fire. Обратите внимание на то, как в данном проекте решается проблема с выходным параметром события — Permit. Принята следующая стратегия: возвращаемое значение Permit будет истинно, если все обработчики согласны с этим. Поэтому каждый обработчик использует конъюнкцию выработанного им значения со значением, пришедшим от предыдущего обработчика. В данном примере все зависит от пожарных, которые могут вырабатывать разные решения.

Для полноты картины необходимо показать, как выглядит класс, задающий аргументы события, который, как и положено, является потомком класса EventArgs;

public class FireEventArgs: EventArgs

{

private int build;

private int day;

private bool permit;

public int Build

{

get{ return(build);} ///set{ build = value;}

}

public int Day

{

get{ return(day);} ///set{ day = value;}

}

Поделиться:
Популярные книги

Особое назначение

Тесленок Кирилл Геннадьевич
2. Гарем вне закона
Фантастика:
фэнтези
6.89
рейтинг книги
Особое назначение

Шесть тайных свиданий мисс Недотроги

Суббота Светлана
Любовные романы:
любовно-фантастические романы
эро литература
7.75
рейтинг книги
Шесть тайных свиданий мисс Недотроги

Отмороженный 7.0

Гарцевич Евгений Александрович
7. Отмороженный
Фантастика:
рпг
аниме
5.00
рейтинг книги
Отмороженный 7.0

Прометей: Неандерталец

Рави Ивар
4. Прометей
Фантастика:
героическая фантастика
альтернативная история
7.88
рейтинг книги
Прометей: Неандерталец

Измена. Верни мне мою жизнь

Томченко Анна
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Верни мне мою жизнь

Кодекс Охотника. Книга XXIX

Винокуров Юрий
29. Кодекс Охотника
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Кодекс Охотника. Книга XXIX

Проиграем?

Юнина Наталья
Любовные романы:
современные любовные романы
6.33
рейтинг книги
Проиграем?

На границе империй. Том 10. Часть 2

INDIGO
Вселенная EVE Online
Фантастика:
космическая фантастика
5.00
рейтинг книги
На границе империй. Том 10. Часть 2

Бестужев. Служба Государевой Безопасности. Книга вторая

Измайлов Сергей
2. Граф Бестужев
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Бестужев. Служба Государевой Безопасности. Книга вторая

«Три звезды» миллиардера. Отель для новобрачных

Тоцка Тала
2. Три звезды
Любовные романы:
современные любовные романы
7.50
рейтинг книги
«Три звезды» миллиардера. Отель для новобрачных

Идеальный мир для Социопата

Сапфир Олег
1. Социопат
Фантастика:
боевая фантастика
рпг
постапокалипсис
6.17
рейтинг книги
Идеальный мир для Социопата

Огненный князь

Машуков Тимур
1. Багряный восход
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Огненный князь

Система Возвышения. Второй Том. Часть 1

Раздоров Николай
2. Система Возвышения
Фантастика:
фэнтези
7.92
рейтинг книги
Система Возвышения. Второй Том. Часть 1

Мастер Разума V

Кронос Александр
5. Мастер Разума
Фантастика:
городское фэнтези
попаданцы
5.00
рейтинг книги
Мастер Разума V