Диаграмма классов разработанного приложения приведена на рисунке 7.1.
Так как при изменении количества продавцов зарплата менеджера изменяется и данное изменение отображается в окне формы, выполняются следующие действия:
В классе продавец (Assistant) создается событие «Добавление продавца» (AddAssistant). Данное событие возникает при создании нового экземпляра класса продавец (Assistant). Другими словами, класс Assistant является издателем события; Для реализации механизма обработки события используется стандартный делегат из библиотеки. NET – EventHandler; Обработка события выполняется в классах – получателях события (класс Manager и класс Form1). Для этого в них описываются методы-обработчики событий, сигнатура которых соответствует типу делегата. В классе Manager – это метод DoEvent, а в классе Form1 – это метод ViewEvent. Таким образом, классы Manager и Form1 являются подписчиками; Каждый объект (не класс), желающий получать сообщение должен зарегистрировать в объекте - издателе этот метод.Экранная форма разработанного приложения приведена на рисунке 7.2.
Список используемых элементов управления приведен в таблице 7.1.


Табл. 6.1. Список используемых элементов управления
Элемент управления | Класс | Описание |
textBox1 | TextBox | Окно ввода имени продавца |
textBox2 | TextBox | Окно ввода фамилии продавца |
textBox3 | TextBox | Окно ввода стажа продавца |
textBox4 | TextBox | Окно вывода списка продавцов |
textBox5 | TextBox | Окно ввода оклада продавца |
textBox6 | TextBox | Окно ввода имени менеджера |
textBox7 | TextBox | Окно ввода фамилии менеджера |
textBox8 | TextBox | Окно ввода стажа менеджера |
textBox9 | TextBox | Окно ввода оклада менеджера |
textBox10 | TextBox | Окно вывода зарплаты менеджера |
button1 | Button | Командная кнопка «Создать продавца» (экземпляр класса «Продавец») |
button2 | Button | Командная кнопка «Создать менеджера» (экземпляр класса «Менеджер») |
button3 | Button | Командная кнопка «Обновить список продавцов» |
Последовательность действий по программированию приложения:

В появившемся контекстном меню выберите пункты Add→New Item. В появившемся окне в списке Templates выберите пункт Class и в поле Name введите имя Person. cs (рис. 7.4). В C# принято давать имена файлам по имена класса, который. В нем хранится.

Класс Person будет иметь вид:
class Person
{
protected string name;
public string Name
{
get { return name; }
set { name = value; }
}
protected string fio;
public string Fio
{
get { return fio; }
set { fio = value; }
}
protected int salary;
public int Salary
{
get { return salary; }
set { salary = value; }
}
}
Где переменные name (имя), fio(фамилия) и salary (оклад) – поля, а Name, Fio и Salary – свойства. В Visual Studio, чтобы превратить переменную в свойство, нужно выделить переменную и в появившемся контекстном меню последовательно выбрать пункты: Refactor → Encapsulated Fiels (Улучшение → Инкапсулировать поле). В ответ появится окно, в котором нужно ввести имя будущего свойства. Свойства желательно именовать так же как и переменные, но только с большой буквы.
Создание класса Assisstant (Продавец). Класс также помещается в отдельный файл Assisstant. сs. Класс Assisstant имеет вид:
// На интерфейс ISalSum пока не обращаем внимания
// (его можно пока не указывать)
class Assistant:Person, ISalSum
{
protected int seniority;
// На данную строку пока не обращаем внимания
//(ее можно пока пропустить)
public event EventHandler AddAssistant;
public int Seniority
{
get { return seniority; }
set { seniority = value; }
}
protected double salarysum;
public double Salarysum
{
get { return salarysum; }
set { salarysum = value; }
}
// На данную функцию пока не обращаем внимания
// (ее можно пока пропустить)
double ISalSum. CalcSalSum()
{
salarysum = this. Salary + seniority * 0.2;
if (AddAssistant!= null) AddAssistant(this, null);
return salarysum;
}
}
Как видно из листинга, класс Assistant является дочерним классом класса Person и содержит дополнительное поле seniority (стаж) и соответствующее ему свойство Seniority.
Создание класса Manager (Менеджер). Класс также помещается в отдельный файл Manager. сs. Класс Manager имеет вид:// На интерфейс ISalSum пока не обращаем внимания
// (его можно пока не указывать)
class Manager:Assistant, ISalSum
{
int subordinate;
public int Subordinate
{
get { return subordinate; }
set { subordinate = value; }
}
public static bool f=false;
// На данную функцию пока не обращаем внимания
// (ее можно пока пропустить)
double ISalSum. CalcSalSum()
{
Salarysum = this. Salary + this. Seniority * 0.2+subordinate*0.2;
return Salarysum;
}
// На данную функцию пока не обращаем внимания
public void DoEvent(object sender, EventArgs e)
{
salarysum = salary + seniority * 0.2 + subordinate * 0.2;
}
}
Как видно из листинга, класс Assistant является дочерним классом класса Person и содержит дополнительное поле subordinate (количество подчиненных) и соответствующее ему свойство Subordinate.
Кроме того, класс Manager содержит статическое поле f – признак того, что объект Manager создан, но его поля не заполнены.
Объявляем интерфейс ISalSum, содержащий объявление метода CalcSalSum – для расчета зарплаты. Интерфейс будет располагаться в отдельном файле ISalSum. cs, который создается аналогично файлам для классов. Для создания интерфейса щелкните правой кнопкой мыши по имени проекта (как показано на рисунке 7.3). В появившемся контекстном меню выберите пункты Add→New Item. В появившемся окне в списке Templates выберите пункт Interface и в поле Name введите имя ISalSum. cs. В C# принято, чтобы имена интерфейсов начинались с буквы «I». Класс ISalSum имеет вид:
interface ISalSum
{
double CalcSalSum();
}
Функции, объявленные в интерфейсах, должны быть реализованы. В данном примере функция CalcSalSum реализована в классах Assistant и Manager. Для реализации интерфейса:
8.1. При объявлении классов Assistant и Manager указывают интерфейс:
class Assistant:Person, ISalSum
и
class Manager:Assistant, ISalSum
8.2. Кроме того, классы Assistant и Manager должны содержать программную реализацию функции CalcSalSum
В классе Form1 описываем глобальные переменные:public ArrayList section = new ArrayList();
Manager mngr;
Где объект mngr (менеджер) нужен для того, чтобы использовать этот объект в различных функциях класса Form1, а динамический список section служит для хранения списка продавцов. Для корректной работы динамического списка ArrayList может быть придется добавить пространство имен System. Collections;
Так как при изменении количества продавцов изменяется и зарплата менеджера в классе Assistant объявляем событие AddAssistant:public event EventHandler AddAssistant;
Для реализации механизма обработки события используется стандартный делегат EventHandler
Событие AddAssistant будет издаваться при создании нового объекта Assistant (продавец). Логичнее было бы поместить издание события в конструктор. Но в данном примере событие AddAssistant издается при расчете зарплаты продавца (а так как расчет зарплаты происходит при создании объекта Assistant, то ошибки не будет) Обработка события будет выполняться в двух классах Manager и Form1. В классе Manager будет введена функция DoEvent для пересчета зарплаты менеджера (см. листинг в пункте 5 ), а в классе Form1 – функция ViewEvent для отображения на экране измененной зарплаты. Функция ViewEvent, реализованная в классе Form1 имеет вид:public void ViewEvent(object sender, EventArgs e)
{
textBox10.Text = mngr. Salarysum. ToString();
}
Теперь событие сформировано и обработчики события созданы. Осталось только подписаться на событие. Полписка на событие происходит при создании нового экземпляра класса Assistant (Событие Click кнопки button1). Для события Load формы Form1 пишем следующий программный код:
private void Form1_Load(object sender, EventArgs e)
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 |


