public class CPerson : Object
{
public string fname;
public CPerson(string aname)
{
fname = aname;
}
public virtual string info ()
{
return fname;
}
}
В пространстве имен приложения (вне класса формы) создайте класс «Студент» (CStud):// Класс студент
public class CStud:CPerson
{
public int fstip;
public CStud(string aname, int astip):base (aname)
{
fname=aname;
fstip=astip;
}
public override string info()
{
return fname+" стипендия "+ fstip. ToString();
}
}
В пространстве имен приложения (вне класса формы) создайте класс «Преподаватель» (CProf):// Класс преподаватель
public class CProf : CPerson
{
string fkaf;
public CProf(string aname, string akaf):base (aname)
{
fname=aname;
fkaf=akaf;
}
public override string info()
{
return fname + " кафедра " + fkaf. ToString();
}
}
В пространстве имен приложения (вне класса формы) создайте класс «Институт» (CInst):// Класс институт
public class CInst:CPerson
{
public SortedList<string, CStud> Stud=new SortedList<string, CStud>();
public SortedList<string, CProf> Prof = new SortedList<string, CProf>();
public CInst(string aname):base (aname)
{
fname = aname;
}
}
В классе формы в области глобальных переменных объявляется объект класса CInst:public CInst Inst;
Для события Activated формы Form1 пишем следующий программный код:private void Form1_Activated(object sender, EventArgs e)
{
// По умолчанию выбрал объект «Студент»
radioButton1.Checked = true;
radioButton2.Checked = false;
// Вызываем конструктор для создания объекта «Институт»
Inst=new CInst("СФ МЭИ"); }
Для события Click кнопки button1 (Добавить студента/преподавателя) пишем следующий программный код:private void button1_Click(object sender, EventArgs e)
{
// Выбран студент
if (radioButton1.Checked)
{
// Вызываем конструктор для создания объекта класса CStud «Студент»
CStud St = new CStud(textBox1.Text, Convert. ToInt32(textBox2.Text));
//Добавляем нового студента в список студентов объекта класса CInst --//«Институт»
Inst. Stud. Add(St. fname, St);
}
else
// Выбран преподаватель
{
CProf Pr = new CProf(textBox1.Text, textBox2.Text);
Inst. Prof. Add(Pr. fname, Pr);
}
}
Для события Click кнопки button2 (Вывод списка студентов/преподавателей) пишем следующий программный код:private void button2_Click(object sender, EventArgs e)
{
listBox1.Items. Clear();
if (radioButton1.Checked)
{
label3.Text = "Студенты";
foreach (CStud St in Inst. Stud. Values)
{
listBox1.Items. Add(St. fname);
}
}
else
{
label3.Text = "Преподаватели";
foreach (CProf Pr in Inst. Prof. Values)
{
listBox1.Items. Add(Pr. fname);
}
}
}
Для события Click кнопки button3 (Удалить студента/преподавателя) пишем следующий программный код:private void button3_Click(object sender, EventArgs e)
{
string s;
if (radioButton1.Checked && Inst. Stud. Count > 0)
{
s = listBox1.SelectedItem. ToString();
Inst. Stud. Remove(s);
}
else
{
s = listBox1.SelectedItem. ToString();
Inst. Prof. Remove(s);
}
}
В компоненте listBox1 выбираем фамилию удаляемого студента и удаляем его из списка Stud или Prod взависимости от выбранного режима (студенты или преподаватели)
Лабораторная работа 7. ИНТЕРФЕЙСЫ, ДЕЛЕГАТЫ, СОБЫТИЯ
7.1 Теоретическое введение
7.1.1 Интерфейсы
В C# для полного отделения структуры класса от его реализации используется механизм интерфейсов. Интерфейс является расширением идеи абстрактных классов и методов.
Синтаксис интерфейсов подобен синтаксису абстрактных классов. Объявление интерфейсов выполняется с помощью ключевого слова interface. При этом методы в интерфейсе не поддерживают реализацию. Членами интерфейса могут быть методы, свойства, индексаторы и события.
Интерфейс может реализовываться произвольным количеством классов. Один класс, в свою очередь, может реализовывать любое число интерфейсов. Каждый класс, включающий интерфейс, должен реализовывать его методы. В интерфейсе для методов неявным образом задается тип public. В этом случае также не допускается явный спецификатор доступа.
Синтаксис:
[атрибуты] [модификаторы] interface Имя_интерфейса[:список_родительских_интерфейсов] {
обьявление_свойств_и_методов}
Пример:
class Animal
{
public string Name;
private int Weight;
protected int Type;
public int Animal(int W, int T, string N)
{
Weight=W;
Type=T;
Name=N;
}
public int GetWeight(){return Weight;}
}
interface Species
{
string Species();
void Feed();
}
class Cheetah:Animal, Species
{
private string ScientificName;
public string Species()
{
return ScientificName;
}
public void Feed()
{Weight++;}
}
Можно объявлять ссылочную переменную, имеющую интерфейсный
тип. Подобная переменная может ссылаться на любой объект, который реализует ее интерфейс. При вызове метода объекта с помощью интерфейсной ссылки вызывается версия метода, реализуемого данным объектом.
Возможно наследование интерфейсов. В этом случае используется синтаксис, аналогичный наследованию классов. Если класс реализует интерфейс, который наследует другой интерфейс, должна обеспечиваться реализация для всех членов, определенных в составе цепи наследования интерфейсов.
7.1.2 Делегаты
Делегат — это объект, имеющий ссылку на метод. Делегат позволяет выбрать вызываемый метод во время выполнения программы. Фактически значение делегата – это адрес области памяти, где находится точка входа метода.
Важным свойством делегата является то, что он позволяет указать в коде программы вызов метода, но фактически вызываемый метод определяется во время работы программы, а не во время компилирования.
Делегат объявляется с помощью ключевого слова delegate, за которым
указывается тип возвращаемого значения, имя делегата и список параметров
вызываемых методов.
Синтаксис: delegate тип_возвращаемого_значения имя_делегата (список_параметров);
Xарактерной особенностью делегата является возможность его использования для вызова любого метода, который соответствует подписи делегата. Это дает возможность определить во время выполнения программы, какой из методов должен быть вызван. Вызываемый метод может быть методом экземпляра, ассоциированным с объектом, либо статическим методом, ассоциированным с классом. Метод можно вызвать только тогда, когда его подпись соответствует подписи делегата.
Многоадресность делегатов. Многоадресность - это способность делегата хранить несколько ссылок на различные методы, что позволяет при вызове делегата инициировать эту цепочку методов.
Для создания цепочки методов необходимо создать экземпляр делегата,
и пользуясь операторами + или += добавлять методы к цепочке. Для удаления метода из цепочки используется оператор - или -=. Делегаты, хранящие несколько ссылок, должны иметь тип возвращаемого значения void.
События. Событие - это автоматическое извещение о каком-либо произошедшем действии. События являются членами класса и объявляются с использованием ключевого слова event. Механизм событий основан на использовании делегатов.
Синтаксис: event имя_делегата имя_обьекта;
Широковещательные события. События могут активизировать несколько обработчиков, в том числе те, что определены в других объектах. Такие события называются широковещательными. Широковещательные события создаются на основе многоадресных делегатов.
Пример:
// Объявление делегата, на основе которого будет определено событие.
delegate void MyEventHandler () ;
// Объявление класса, в котором инициируется событие.
class MyEvent
{
public event MyEventHandler activate;
// В этом методе инициируется событие.
public void fire()
{ if (activate!= null) activate();
}
class X
{
public void Xhandler()
{
Console. WriteLine("Событие получено объектом класса X.");
}
}
class Y
{
public void Yhandler()
{
Console. WriteLine("Событие получено объектом
класса Y.");
}
}
class EventDemo
{
static void handler()
{
Console. WriteLine("Событие получено объектом
класса EventDemo.")
}
public static void Main()
{
MyEvent evt = new MyEvent();
X xOb = new X();
Y yOb = new Y();
// Добавление методов handler (), Xhandler()
// и Yhandler() в цепочку обработчиков события.
evt. activate += new MyEventHandler(handler);
evt. activate += new MyEventHandler(xOb. Xhandler);
evt. activate += new MyEventHandler(yOb. Yhandler);
evt. fire();
Console. WriteLine();
evt. activate -= new MyEventHandler(xOb. Xhandler);
evt. fire();
}
}
7.2 Пример приложения для работы с интерфейсами, делегатами и событиями
В качестве примера рассмотрим объектно-ориентированное приложение – «Отдел магазина». Приложение включает следующие пользовательские классы:
- Класс человек «Person» - включает следующие свойства – Имя (Name), Фамилию (Fio) и оклад (Salary); Класс продавец «Assistant» - наследник класса «Person», содержит все свойства родительского класса, а также и дополнительные свойства Стаж (Seniority) и Зарплата (Salarysum). Зарплата рассчитывается как оклад плюс стаж умноженный на 2% (Salarysum =Salary+ Seniority*0.2); Класс менеджер (зав. отделом, управляющий) «Manager» - наследник класса «Assistant», содержит все свойства родительского класса и дополнительное свойство Количество подчиненных (Subordinate). Зарплата у менеджера рассчитывается как оклад плюс стаж умноженный на 2% плюс количество подчиненных умноженное на 2% (Salarysum =Salary+ Seniority*0.2+ Subordinate*0.2) .
Кроме того, приложение содержит интерфейсный класс ISalSum, в котором объявлен метод – Расчет зарплаты (CalcSalSum). Реализация данного метода приведена в классах Assistant и Manager. Данные классы являются наследниками интерфейсного класса ISalSum.
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 |


