События (event)
События – реакция программы на действия пользователя или другой программы или внешней среды.
События являются методами, т.е. у событий могут быть аргументы и возвращаемые значения. Метод, реагирующий на события, называется обработчиком события.
class MyButtonClass : Form
{
private Button mrButton;
public MyButtonClass()
{
mrButton = new Button();
mrButton.Click += new System.EventHandler(MyButtonClickEventHandler);
this.Controls.Add(mrButton)
}
static void Main()
{
Application.Run(new MyButtonClass());
}
void MyButtonClickEventHandler(object sender, EventArgs e)
{
MrButton.Text = "Push";
}
}
Обработчик нажатия кнопки называется MyButtonClickEventHandler – метод должен запускаться каждый раз, когда происходит нажатие на кнопку. Сейчас необходимо связать событие Click (нажатие на кнопку) с методом обработчика событий.
Для создания собственных событий используется специальный класс – delegate.
Пространство имен
Имена многих базовых классов и имена классов из используемых библиотек весьма обширны. Когда используется многоуровневое наследование приходится описывать всю цепочку имен для использования какого-либо класса. Для этого придумана организация файлов с помощью пространства имен.
Пространство имен содержит классы одной тематики.
Пространства имен могут обобщаться в еще более крупные пространства имен.
Лекция 11.
Множественное наследование и коллизия имен
При множественном наследовании рассматриваются две основные проблемы:
Коллизия имен
Наследование от общего предка
Проблема коллизии возникает если два или более интерфейса имеют методы с одинаковыми именами или сигнатурами. Если имена совпадают, но сигнатуры различаются, то используется перегрузка. В случае если совпадают имена и сигнатуры этих методов, то выходом может быть:
Склеивание – используется в случае если класс, наследуемый от двух или более интерфейсов, считает, что разные интерфейсы задают один и тот же метод, для которого должна быть обеспечена единая реализация наследником. Наследник строит единственную реализацию метода, соответствующую всем наследуемым интерфейсам.
Переименование – несмотря на то, что сигнатуры методов в интерфейсах одинаковы, эти методы должны быть реализованы по-разному. В этой ситуации необходимо переименовать конфликтующие методы:
Переименование методов в самих интерфейсах – неправильный путь, так как способ реализации наследника и условия реализации наследника не должны требовать изменения родителей, изменяться должен только наследник.
Переименование метода интерфейса в самом классе наследника – для этого реализуются методы различных интерфейсов как закрытые, а затем открываются с переименованием. Пример : public interface IProps { void Prop1(string s); void Prop2(string name, int val); void Prop3(); } public interface IPropsOne { void Prop1(string s); void Prop2(int val); void Prop3(); } public class ClainTwo:IProps, IPropsOne { public void Prop1(string s) { Console.WriteLine(s); } public void Prop2(string s, int val) { Console.WriteLine(s+” ”+x); } public void Prop2(int x) { Console.WriteLine(x); } void IProps.Prop3() { Console.WriteLine(“Свойство 3 интерфейса 1”); } void IPropsOne.Prop3() { Console.WriteLine(“Свойство 3 интерфейса 2”); } public void Prop3From1() { ((IProps)this).Prop3(); } public void Prop3From2() { ((IPropsOne)this).Prop3() } }
