Диаграмма классов разработанного приложения приведена на рисунке 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

Командная кнопка «Обновить список продавцов»


Последовательность действий по программированию приложения:

НЕ нашли? Не то? Что вы ищете?
Создайте приложение,  окно которого изображенное на рисунке 7.2.

Создайте класс Person. Каждый класс будет храниться в отдельном файле, для это щелкните правой кнопкой мыши по имени проекта (рис.7.3).

В появившемся контекстном меню выберите пункты 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