Событие Хайнриха
- 1 year ago
- 0
- 0
Событие в объектно-ориентированном программировании — это сообщение, которое возникает в различных точках исполняемого кода при выполнении определённых условий.
События предназначены для того, чтобы иметь возможность предусмотреть реакцию программного обеспечения.
Для решения поставленной задачи создаются обработчики событий: как только программа попадает в заданное состояние, происходит событие, посылается сообщение, а обработчик перехватывает это сообщение. В общем случае в обработчик не передаётся ничего, либо передаётся ссылка на объект, инициировавший (породивший) обрабатываемое событие. В особых случаях в обработчик передаются значения некоторых переменных или ссылки на какие-то другие объекты , чтобы обработка данного события могла учесть контекст возникновения события.
Самое простое событие — это событие, сообщающее о начале или о завершении некоторой процедуры . Событие, по сути, сообщает об изменении состояния некоторого объекта. Наиболее наглядно события представлены в пользовательском интерфейсе , когда каждое действие пользователя порождает цепочку событий, которые, затем обрабатываются в приложении .
В объектно-ориентированном анализе для описания динамического поведения объектов принято использовать модель состояний.
Событие — это переход объекта из одного состояния в другое. Взаимодействие объектов также осуществляется при помощи событий: изменение состояния одного объекта приводит к изменению состояния другого объекта, а событие оказывается средством связи между объектами.
Согласно , событие — это «абстракция инцидента или сигнала в реальном мире, который сообщает нам о перемещении чего-либо в новое состояние». Далее, выделяются четыре аспекта события:
Первый ряд примеров событий доставляет собственно сам жизненный цикл объекта:
Более сложные примеры событий возникают тогда, когда у объекта появляются внутренние состояния, которые описываются соответствующей диаграммой переходов (из одного состояния в другое).
События позволяют классу или объекту уведомлять другие классы или объекты о возникновении каких-либо ситуаций. Класс, отправляющий (или вызывающий) событие, называется издателем, а классы, принимающие (или обрабатывающие) событие, называются подписчиками. События представляют собой экземпляры делегатов, способные хранить, добавлять и удалять делегаты такого же типа (обработчики событий). При вызове события вызываются все делегаты, которые были добавлены к событию. События могут быть вызваны только из класса или объекта, которому принадлежит событие. Делегатно-событийная модель, применяемая, например, при разработке графических интерфейсов, основана на:
К тому же, модель требует, чтобы:
delegate void Notifier (string sender);
class Model {
public event Notifier notifyViews;
public void Change() { ... notifyViews("Model"); }
}
class View1 {
public View1(Model m) {
m.notifyViews += new Notifier(this.Update1);
}
void Update1(string sender) {
Console.WriteLine(sender + " was changed during update");
}
}
class View2 {
public View2(Model m) {
m.notifyViews += new Notifier(this.Update2);
}
void Update2(string sender) {
Console.WriteLine(sender + " was changed");
}
}
class Test {
static void Main() {
Model model = new Model();
new View1(model);
new View2(model);
model.Change(); // Оба метода Update1 и Update2 вызовутся.
}
}
В VB.NET события объявляются ключевым словом Event. Если опущен тип делегата, то компилятор сам создаст его, который может в дальнейшем содержать ссылку на метод, реализованный в подписчике.
Реализовать подписку на событие можно несколькими способами:
Imports System
Public Class CTimer
Delegate Sub SecondDel(ByVal xintTime As Integer)
Private evtSecond As SecondDel
Public Event evtMinute As SecondDel
Public Event evtHour(ByVal xHour As Integer)
public Shared lngSeconds As Long
Public Sub Register(ByVal objSecond As SecondDel)
evtSecond = evtSecond.Combine(evtSecond, objSecond)
End Sub
Public Sub OnTimer()
lngSeconds = lngSeconds + 1
If lngSeconds Mod 5 = 0 Then
evtSecond(lngSeconds) 'Вызов метода делегата
End If
If lngSeconds Mod 10 = 0 Then
RaiseEvent evtMinute(lngSeconds) 'Генерация события
End If
If lngSeconds Mod 30 = 0 Then
RaiseEvent evtHour(lngSeconds) 'Генерация события
End If
End Sub
End Class
Public Class CClock
Private WithEvents mobjTimer As CTimer 'Объявление объекта класса, с возможностью подключения к событиям
Sub New()
mobjTimer = New CTimer()
mobjTimer.Register(New CTimer.SecondDel(AddressOf SecondEvent)) 'Регистрация события через метод предоставленный классом
AddHandler mobjTimer.evtMinute, AddressOf MinuteEvent 'Регистрация события с помощью оператора AddHandler
While (mobjTimer.lngSeconds < 60)
mobjTimer.OnTimer()
System.Threading.Thread.Sleep(100)
End While
End Sub
Private Sub SecondEvent(ByVal xintTime As Integer)
Console.WriteLine("Second's Event")
End Sub
Private Sub MinuteEvent(ByVal xintTime As Integer)
Console.WriteLine("Minute's Event")
End Sub
'Регистрация события с помощью ключевого слова Handles
Private Sub mobjTimer_evtHour(ByVal xintTime As Integer) Handles mobjTimer.evtHour
Console.WriteLine("Hour's Event")
End Sub
Public Shared Sub Main()
Dim cc1 = New CClock()
End Sub
End Class