Eveniment (programare orientată pe obiecte)
Un eveniment din programarea orientată pe obiecte este un mesaj care apare în diferite puncte ale codului executabil atunci când sunt îndeplinite anumite condiții.
Evenimentele sunt menite să poată anticipa cum va reacționa software-ul. [unu]
Pentru a rezolva sarcina, sunt creați handleri de evenimente: de îndată ce programul intră în starea specificată, are loc un eveniment, este trimis un mesaj, iar handlerul interceptează acest mesaj. În cazul general, nu se transmite nimic către handler sau se trece o referință la obiectul care a inițiat (a generat) evenimentul în curs de procesare. În cazuri speciale, valorile unor variabile sau referințe la alte obiecte sunt transmise handlerului, astfel încât procesarea acestui eveniment să țină cont de contextul în care a avut loc evenimentul.
Cel mai simplu eveniment este un eveniment care anunță începutul sau finalizarea unei proceduri . Un eveniment, în esență, raportează o schimbare a stării unui obiect. Evenimentele sunt cel mai clar reprezentate în interfața cu utilizatorul , atunci când fiecare acțiune a utilizatorului generează un lanț de evenimente, care sunt apoi procesate în aplicație .
Descriere generală
În analiza orientată pe obiecte , se obișnuiește să se utilizeze modelul de stare pentru a descrie comportamentul dinamic al obiectelor. [2]
Un eveniment este o tranziție a unui obiect de la o stare la alta. Interacțiunea obiectelor se realizează și cu ajutorul evenimentelor: o schimbare a stării unui obiect duce la o schimbare a stării altui obiect, iar evenimentul se dovedește a fi un mijloc de comunicare între obiecte.
Potrivit [2] , un eveniment este „o abstractizare a unui incident sau semnal din lumea reală care ne spune că ceva s-a mutat într-o stare nouă”. În plus, se disting patru aspecte ale evenimentului:
- label — identificatorul unic al evenimentului.
- valoare - un mesaj text despre esența a ceea ce sa întâmplat.
- destinație - modelul de eveniment care primește evenimentul.
- date - date care sunt transferate de la un obiect la altul.
Exemple
Primul set de exemple de evenimente este oferit de ciclul de viață al obiectului însuși:
- crearea de obiecte;
- distrugerea obiectelor.
Exemple mai complexe de evenimente apar atunci când un obiect are stări interne care sunt descrise printr-o diagramă de tranziție corespunzătoare (de la o stare la alta).
Evenimente în .Net
Evenimentele permit unei clase sau obiecte să notifice alte clase sau obiecte atunci când apar anumite situații. Clasa care trimite (sau generează) un eveniment se numește editor, iar clasele care primesc (sau gestionează) un eveniment se numesc abonați. Evenimentele sunt instanțe de delegat capabile să stocheze, să adauge și să elimine delegați de același tip (gestionare de evenimente). Când un eveniment este lansat, toți delegații care au fost adăugați la eveniment sunt chemați. Evenimentele pot fi apelate numai din clasa sau obiectul căruia îi aparține evenimentul. [3]
Modelul delegat-eveniment, utilizat, de exemplu, în dezvoltarea interfețelor grafice, se bazează pe:
- obiectul de control care este sursa evenimentelor
- un observator , numit și handler de evenimente, care primește notificări de evenimente de la sursă
- interfețe (într-un sens mai larg) care descriu modul (protocolul) de schimb de evenimente.
În plus, modelul necesită următoarele:
- fiecare observator a implementat o interfață pentru evenimentele la care dorește să se aboneze
- fiecare observator trebuie să se înregistreze la sursă pentru a-și exprima intenția de a primi evenimente.
- de fiecare dată când sursa emite un eveniment, îl transmite observatorilor folosind protocolul de interfață.
În C#
delegat void Notifier ( string sender );
class Model {
public event Notifier notifyViews ;
public void Modificare () { ... notifyViews ( „Model” ); }
}
clasa View1 {
public View1 ( Model m ) {
m . notifyViews += new Notifier ( acest . Update1 );
}
void Update1 ( string sender ) {
Consolă . WriteLine ( expeditorul + " a fost schimbat în timpul actualizării " );
}
}
clasa View2 {
public View2 ( Model m ) {
m . notifyViews += new Notifier ( acest . Update2 );
}
void Update2 ( string sender ) {
Consolă . WriteLine ( expeditorul + „a fost schimbat” );
}
}
class Test {
static void Main () {
Model model = new Model ();
newView1 ( model ) ; newView2 ( model ) ; model . Modificare (); // Vor fi apelate ambele metode Update1 și Update2. } }
În VB.NET
În VB.NET, evenimentele sunt declarate cu cuvântul cheie Event. Dacă tipul delegat este omis, atunci compilatorul însuși îl va crea, care poate conține ulterior o referință la metoda implementată în abonat.
Puteți implementa un abonament la eveniment în mai multe moduri:
- evtSample As sampleDel - Mecanismul de înregistrare a unui handler de evenimente pentru un anumit tip de declarație trebuie furnizat de către clasa cu evenimentul declarat. Evenimentul este generat prin apelarea unei metode pe delegatul evtSample.
- Eveniment public evtSample Ca sampleDel - Un handler de evenimente poate fi înregistrat folosind instrucțiunea AddHandler, care va lega evenimentul sursă și metoda în clasa de abonat. Evenimentul este implementat folosind delegatul declarat sampleDel. Evenimentul este generat folosind instrucțiunea RaiseEvent.
- Eveniment public evtSample - Managerul de evenimente va fi înregistrat folosind cuvântul cheie WithEvents în declarația instanței de clasă și Handle în declarația metodei clasei de abonat în sine. Un eveniment este implementat folosind un delegat declarat implicit. Evenimentul este generat folosind instrucțiunea RaiseEvent.
Sistem de import
Clasa publică CTimer
Delegat Sub SecondDel ( ByVal xintTime As Integer )
Private evtSecond As SecondDel
Eveniment public evtMinute As SecondDel
Eveniment public evtHour ( ByVal xHour As Integer ) public Shared lngSeconds As Long
Subregistru public ( ByVal objSecond As SecondDel ) evtSecond = evtSecond . _ Combină ( evtSecond , objSecond ) End Sub
Public Sub OnTimer ()
lngSeconds = lngSeconds + 1 Dacă
lngSeconds Mod 5 = 0 Apoi evtSecond
( lngSeconds ) ' Metoda delegatului
de apel End If
If lngSeconds Mod 10 = 0 Atunci
RaiseEvent evtMinute ( lngSeconds = 0 Mod Raise EventSecond ) Apoi RaiseEvent evtHour ( lngSeconds ) 'Raise event End If End Sub
termina clasa
Clasa publică CClock
Private WithEvents mobjTimer Ca Declarație de obiect de clasă CTimer , cu posibilitatea de a se conecta la evenimente
Sub New ()
mobjTimer = New CTimer ()
mobjTimer . Register ( New CTimer . SecondDel ( AddressOf SecondEvent )) 'Înregistrați un eveniment prin metoda oferită de clasa
AddHandler mobjTimer . evtMinute , AddressOf MinuteEvent 'Înregistrarea unui eveniment cu AddHandler
While ( mobjTimer . lngSeconds < 60 )
mobjTimer . Sistem OnTimer ()
. filetare . fir . Sleep ( 100 ) End While End Sub
Private Sub SecondEvent ( ByVal xintTime As Integer )
Consola . WriteLine ( "Evenimentul celui de-al doilea" )
End Sub
Private Sub MinuteEvent ( ByVal xintTime As Integer )
Consola . WriteLine ( "Evenimentul minutelor" )
End Sub
„Înregistrarea unui eveniment utilizând cuvântul cheie Handles
Private Sub mobjTimer_evtHour ( ByVal xintTime As Integer ) Se ocupă de mobjTimer . Consola evtHour
. WriteLine ( "Evenimentul orei" ) End Sub
Public Shared Sub Main ()
Dim cc1 = New CClock ()
End Sub
termina clasa
Vezi și
Link -uri
Note
- ↑ Evenimentele sunt asemănătoare întreruperilor în acest sens .
- ↑ 1 2 Vezi [1].
- ↑ Mössenböck, Hanspeter Advanced C#: Variable Number of Parameters 26. http://ssw.jku.at/Teaching/Lectures/CSharp/Tutorial/:+ Institut für Systemsoftware, Johannes Kepler Universität Linz, Fachbereich Informatik (25 martie 2002) . Preluat la 5 august 2011. Arhivat din original la 20 septembrie 2011. (nedefinit)
Literatură
- Schleer S, Mellor S. Analiză orientată pe obiecte: modelarea lumii în state: Per. din engleza. - Kiev: Dialectica, 1993. - 240 p: ill.