Rendezvény (objektum-orientált programozás)
Az objektumorientált programozásban az esemény olyan üzenet, amely bizonyos feltételek teljesülése esetén
a végrehajtható kód különböző pontjain jelenik meg .
Az események célja, hogy előre jelezzék, hogyan reagál a szoftver. [egy]
A feladat megoldásához eseménykezelőket készítenek: amint a program a megadott állapotba kerül, egy esemény történik, üzenetet küldenek, és a kezelő elfogja ezt az üzenetet. Általános esetben semmit nem ad át a kezelőnek, vagy a feldolgozás alatt álló eseményt kezdeményező (szpawn) objektumra való hivatkozást adják át. Speciális esetekben egyes változók értékei vagy más objektumokra való hivatkozások átadásra kerülnek a kezelőnek , hogy az esemény feldolgozása figyelembe tudja venni azt a kontextust, amelyben az esemény bekövetkezett.
A legegyszerűbb esemény egy olyan esemény, amely bejelenti valamely eljárás kezdetét vagy befejezését . Egy esemény lényegében valamely tárgy állapotának változásáról számol be. Az események a legvilágosabban a felhasználói felületen jelennek meg , amikor minden felhasználói művelet eseményláncot generál, amelyet aztán az alkalmazás feldolgoz .
Általános leírás
Az objektumorientált elemzésben az állapotmodellt szokás használni az objektumok dinamikus viselkedésének leírására. [2]
Az esemény egy objektum átmenete egyik állapotból a másikba. Az objektumok interakciója is események segítségével valósul meg: az egyik objektum állapotának megváltozása egy másik objektum állapotának megváltozásához vezet, és az esemény az objektumok közötti kommunikáció eszközévé válik.
A [2] szerint az esemény "egy incidens vagy jel absztrakciója a való világban, amely azt mondja nekünk, hogy valami új állapotba lépett". Továbbá az esemény négy aspektusát különböztetjük meg:
- címke – az esemény egyedi azonosítója.
- érték - szöveges üzenet a történtek lényegéről.
- célállomás – az eseményt fogadó eseménymodell.
- adatok - az egyik objektumról a másikra átvitt adatok.
Példák
Az események első példáit maga az objektum életciklusa adja:
- tárgy létrehozása;
- tárgy megsemmisítése.
Az események bonyolultabb példái akkor fordulnak elő, ha egy objektum belső állapotokkal rendelkezik, amelyeket egy megfelelő átmeneti diagram ír le (egyik állapotból a másikba).
Az események lehetővé teszik egy osztály vagy objektum számára, hogy értesítsen más osztályokat vagy objektumokat bizonyos helyzetek bekövetkeztekor. Az eseményt elküldő (vagy felhozó) osztályt kiadónak, az eseményt fogadó (vagy kezelő) osztályokat pedig előfizetőknek nevezzük. Az események olyan delegált példányok, amelyek képesek tárolni, hozzáadni és eltávolítani az azonos típusú delegáltakat (eseménykezelőket). Amikor egy esemény megtörténik, az eseményhez hozzáadott összes küldött meghívásra kerül. Az események csak abból az osztályból vagy objektumból hívhatók meg, amelyhez az esemény tartozik. [3]
A delegált esemény modell, amelyet például a grafikus felületek fejlesztésében használnak, a következőkön alapul:
- az események forrásaként szolgáló vezérlőobjektum
- egy megfigyelő , más néven eseménykezelő, amely eseményértesítéseket kap a forrástól
- interfészek (tágabb értelemben), amelyek leírják az eseménycsere módját (protokollját).
Ezenkívül a modell megköveteli, hogy:
- minden megfigyelő megvalósított egy felületet azokhoz az eseményekhez, amelyekre elő szeretne iratkozni
- minden megfigyelőnek regisztrálnia kell a forrásnál, hogy kifejezze szándékát az események fogadására.
- minden alkalommal, amikor a forrás eseményt bocsát ki, az interfész protokoll segítségével továbbítja azt a megfigyelőknek.
C# nyelven
delegate void Notifier ( string sender );
class Model {
nyilvános esemény Notifier notifyViews ;
public void Változás () { ... notifyViews ( "Model" ); }
}
class View1 {
public View1 ( Model m ) {
m . notifyViews += new Notifier ( ez . Frissítés1 );
}
void Frissítés1 ( karakterlánc küldője ) {
Konzol . WriteLine ( feladó + " frissítés közben megváltozott" );
}
}
class View2 {
public View2 ( Model m ) {
m . notifyViews += new Notifier ( ez . Frissítés2 );
}
void Update2 ( karakterlánc küldője ) {
Konzol . WriteLine ( feladó + "módosítva" );
}
}
class Teszt {
static void Main () {
Model model = new Model ();
newView1 ( modell ) ; newView2 ( modell ) ; modell . Változás (); // Az Update1 és Update2 metódusok is meghívásra kerülnek. } }
A VB.NET-ben
A VB.NET-ben az eseményeket az Event kulcsszóval deklarálják. Ha a delegate típust kihagyjuk, akkor a fordító maga hozza létre, ami később tartalmazhat hivatkozást az előfizetőben megvalósított metódusra.
Az esemény-előfizetést többféleképpen is megvalósíthatja:
- evtSample As sampleDel – Az eseménykezelő regisztrálásának mechanizmusát egy adott deklarációtípushoz a deklarált eseménnyel rendelkező osztálynak kell biztosítania. Az esemény az evtSample delegált metódusának meghívásával jön létre.
- Nyilvános esemény evtSample mint sampleDel – Eseménykezelő regisztrálható az AddHandler utasítással, amely megköti a forráseseményt és a metódust az előfizetői osztályban. Az esemény a sampleDel deklarált delegált használatával kerül megvalósításra. Az esemény a RaiseEvent utasítás használatával jön létre.
- Nyilvános esemény evtSample – Az eseménykezelő a WithEvents kulcsszóval lesz regisztrálva az osztálypéldány deklarációjában és a Handles kulcsszóval az előfizetői osztálymetódus deklarációjában. Egy esemény egy implicit módon deklarált delegált segítségével valósul meg. Az esemény a RaiseEvent utasítás használatával jön létre.
Rendszer importálása
Nyilvános osztályú CTimer
Sub SecondDel delegálása ( ByVal xintTime As Integer )
Privát evtSecond mint SecondDel
Nyilvános esemény evtMinute As SecondDel
Nyilvános esemény evtHour ( ByVal xHour As Integer )
nyilvános Megosztott lngSeconds As Long
Nyilvános alregiszter ( 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 ) '
Delegate metódus hívása End If
If lngSeconds Mod 10 = 0 Then
RaiseEvent = evtMinutes 0 Vége evtMinuteslngSecond _ _ _ _ Akkor RaiseEvent evtHour ( lngSeconds ) 'Esemény emelése End If End Sub
végi osztály
Public Class CClock
Private WithEvents mobjTimer As CTimer 'Osztály objektum deklaráció, eseményekhez való csatlakozás lehetőségével
Sub New ()
mobjTimer = Új CTimer ()
mobjTimer . Regisztrálás ( New CTimer . SecondDel ( AddressOf SecondEvent )) 'Esemény regisztrálása az
AddHandler mobjTimer osztály által biztosított módszerrel . evtMinute , AddressOf MinuteEvent 'Esemény naplózása az AddHandler
While segítségével ( mobjTimer . lngSeconds < 60 )
mobjTimer . OnTimer ()
Rendszer . befűzés . szál . Alvó üzemmód ( 100 )
End While
End Sub
Privát Sub SecondEvent ( ByVal xintTime As Integer )
konzol . WriteLine ( "Második esemény" )
End Sub
Privát Sub MinuteEvent ( ByVal xintTime As Integer )
konzol . WriteLine ( "Perc esemény" )
End Sub
"Esemény regisztrálása a Handles
Private Sub mobjTimer_evtHour ( ByVal xintTime As Integer ) kulcsszó használatával MobjTimer kezeli . evtHour konzol . WriteLine ( "Óra esemény" ) End Sub
Nyilvános megosztott al fő ()
Dim cc1 = Új CClock (
) Vége
végi osztály
Lásd még
Linkek
Jegyzetek
- ↑ Az események ebben az értelemben hasonlóak a megszakításokhoz .
- ↑ 1 2 Lásd [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 (március 25.00) 2 . Letöltve: 2011. augusztus 5. Az eredetiből archiválva : 2011. szeptember 20. (határozatlan)
Irodalom
- Schleer S, Mellor S. Objektum-orientált elemzés: A világ modellezése államokban: Per. angolról. - Kijev: Dialektika, 1993. - 240 p: ill.