Událost (objektově orientované programování)
Událost v objektově orientovaném programování je zpráva, která se objeví na různých místech spustitelného kódu , když jsou splněny určité podmínky.
Události jsou určeny k tomu, aby bylo možné předvídat, jak bude software reagovat. [jeden]
K vyřešení úlohy jsou vytvořeny obslužné rutiny událostí: jakmile se program dostane do zadaného stavu, dojde k události, odešle se zpráva a obsluha tuto zprávu zachytí. V obecném případě není obsluze předáno nic nebo je předán odkaz na objekt, který inicioval (vytvořil) zpracovávanou událost. Ve zvláštních případech jsou hodnoty některých proměnných nebo odkazy na některé další objekty předány handleru , aby zpracování této události mohlo vzít v úvahu kontext, ve kterém k události došlo.
Nejjednodušší událostí je událost, která oznamuje začátek nebo dokončení nějaké procedury . Událost v podstatě hlásí změnu stavu nějakého objektu. Události jsou nejjasněji zastoupeny v uživatelském rozhraní , kdy každá uživatelská akce generuje řetězec událostí, které jsou následně zpracovány v aplikaci .
Obecný popis
V objektově orientované analýze je obvyklé používat stavový model k popisu dynamického chování objektů. [2]
Událost je přechod objektu z jednoho stavu do druhého. Interakce objektů se také provádí pomocí událostí: změna stavu jednoho objektu vede ke změně stavu jiného objektu a událost se ukazuje jako prostředek komunikace mezi objekty.
Podle [2] je událost „abstrakce incidentu nebo signálu v reálném světě, který nám říká, že se něco přesunulo do nového stavu“. Dále se rozlišují čtyři aspekty události:
- label — jedinečný identifikátor události.
- hodnota – textová zpráva o podstatě toho, co se stalo.
- cíl – model události, který událost přijímá.
- data – data, která jsou přenášena z jednoho objektu do druhého.
Příklady
První sadu příkladů událostí poskytuje životní cyklus samotného objektu:
- vytváření objektů;
- zničení objektu.
Složitější příklady událostí nastanou, když má objekt vnitřní stavy, které jsou popsány odpovídajícím přechodovým diagramem (z jednoho stavu do druhého).
Události v .Netu
Události umožňují třídě nebo objektu upozornit jiné třídy nebo objekty, když nastanou určité situace. Třída, která odesílá (nebo vyvolává) událost, se nazývá vydavatel a třídy, které přijímají (nebo zpracovávají) událost, se nazývají odběratelé. Události jsou instance delegátů schopné ukládat, přidávat a odebírat delegáty stejného typu (obslužné rutiny událostí). Když je vyvolána událost, jsou voláni všichni delegáti, kteří byli k události přidáni. Události lze volat pouze ze třídy nebo objektu, do kterého událost patří. [3]
Model událostí delegátů, používaný například při vývoji grafických rozhraní, je založen na:
- ovládací objekt, který je zdrojem událostí
- pozorovatel , nazývaný také manipulátor událostí, který přijímá oznámení o událostech ze zdroje
- rozhraní (v širším slova smyslu), která popisují způsob (protokol) výměny událostí.
Model navíc vyžaduje, aby:
- každý pozorovatel implementoval rozhraní pro události, ke kterým se chce přihlásit
- každý pozorovatel se musí zaregistrovat u zdroje, aby vyjádřil záměr přijímat události.
- pokaždé, když zdroj vyšle událost, předá ji pozorovatelům pomocí protokolu rozhraní.
V C#
delegovat void Notifier ( řetězec odesílatel );
class Model {
public event Notifier notifyViews ;
public void Změnit () { ... notifyViews ( "Model" ); }
}
class Pohled1 {
public Pohled1 ( Model m ) {
m . notifyViews += new Notifier ( this . Update1 );
}
void Update1 ( odesílatel řetězce ) { Console . WriteLine ( odesílatel + " bylo změněno během aktualizace" ); } }
class View2 {
public View2 ( Model m ) {
m . notifyViews += new Notifier ( this . Update2 );
}
void Update2 ( odesílatel řetězce ) { Console . WriteLine ( odesílatel + "bylo změněno" ); } }
class Test {
static void Main () {
Model model = new Model ();
newView1 ( model ) ; newView2 ( model ) ; model . Změnit (); // Budou volány metody Update1 i Update2. } }
Ve VB.NET
Ve VB.NET jsou události deklarovány pomocí klíčového slova Event. Pokud je typ delegáta vynechán, pak jej vytvoří samotný kompilátor, který může později obsahovat odkaz na metodu implementovanou v účastníkovi.
Předplatné události můžete implementovat několika způsoby:
- evtSample As sampleDel - Mechanismus pro registraci obsluhy události pro daný typ deklarace musí být poskytnut třídou s deklarovanou událostí. Událost je generována voláním metody na delegátovi evtSample.
- Public Event evtSample As sampleDel – obslužnou rutinu události lze zaregistrovat pomocí příkazu AddHandler, který sváže zdrojovou událost a metodu ve třídě odběratele. Událost je implementována pomocí deklarovaného delegáta sampleDel. Událost je generována pomocí příkazu RaiseEvent.
- Public Event evtSample – obslužná rutina události bude registrována pomocí klíčového slova WithEvents v deklaraci instance třídy a Handles v samotné deklaraci metody třídy odběratele. Událost je implementována pomocí implicitně deklarovaného delegáta. Událost je generována pomocí příkazu RaiseEvent.
Systém importu
CTimer veřejné třídy
Delegovat 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
Veřejný dílčí registr ( 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 ) '
Metoda delegáta volání End If
If lngSeconds Mod 10 = 0 Then
RaiseEvent evtMinute ( lngSeconds IfRise '
_ _
_ _ Potom RaiseEvent evtHour ( lngSeconds ) ' Raise event End If End Sub
závěrečná třída
CClock veřejné třídy
Private WithEvents mobjTimer Jako deklarace objektu třídy CTimer s možností připojení k událostem
Sub New ()
mobjTimer = New CTimer ()
mobjTimer . Register ( New CTimer . SecondDel ( AddressOf SecondEvent )) 'Zaregistrujte událost pomocí metody poskytované třídou
AddHandler mobjTimer . evtMinute , AddressOf MinuteEvent 'Protokolování události pomocí AddHandler
While ( mobjTimer . lngSeconds < 60 )
mobjTimer . Systém OnTimer ()
. závitování . vlákno . Spánek ( 100 ) End While End Sub
Private Sub SecondEvent ( ByVal xintTime As Integer )
Konzola . WriteLine ( "Druhá událost" )
End Sub
Konzola Private Sub MinuteEvent ( ByVal xintTime As Integer )
. WriteLine ( "Minutová událost" ) End Sub
'Registrace události pomocí klíčového slova Handles
Private Sub mobjTimer_evtHour ( ByVal xintTime As Integer ) Handles mobjTimer . Konzole evtHour
. WriteLine ( "hodinová událost" ) End Sub
Public Shared Sub Main ()
Dim cc1 = New CClock ()
End Sub
závěrečná třída
Viz také
Odkazy
Poznámky
- ↑ Události jsou v tomto smyslu podobné přerušením .
- ↑ 1 2 Viz [1].
- ↑ Mössenböck, Hanspeter Advanced C#: Variabilní počet parametrů 26. http://ssw.jku.at/Teaching/Lectures/CSharp/Tutorial/:+ Institut für Systemsoftware, Johannes Kepler Universität Linz, Fachbereich Informatik (25. března) 20 . Získáno 5. srpna 2011. Archivováno z originálu dne 20. září 2011. (neurčitý)
Literatura
- Schleer S, Mellor S. Objektově orientovaná analýza: Modelování světa ve státech: Per. z angličtiny. - Kyjev: Dialektika, 1993. - 240 s: nemoc.