Event (objektorienteret programmering)
En hændelse i objektorienteret programmering er en meddelelse, der opstår på forskellige punkter i den eksekverbare kode, når visse betingelser er opfyldt.
Begivenheder er beregnet til at kunne forudse, hvordan softwaren vil reagere. [en]
For at løse opgaven oprettes hændelseshandlere: så snart programmet går ind i den specificerede tilstand, sker der en hændelse, en meddelelse sendes, og behandleren opsnapper denne meddelelse. I det generelle tilfælde videregives intet til handleren, eller en reference til det objekt, der initierede (affødte) hændelsen, der behandles, videregives. I særlige tilfælde sendes værdierne af nogle variabler eller referencer til nogle andre objekter til behandleren , så behandlingen af denne hændelse kan tage højde for den kontekst, hvor hændelsen fandt sted.
Den enkleste begivenhed er en begivenhed, der annoncerer begyndelsen eller afslutningen af en eller anden procedure . En hændelse rapporterer i bund og grund en ændring i et objekts tilstand. Hændelser er tydeligst repræsenteret i brugergrænsefladen , når hver brugerhandling genererer en kæde af hændelser, som derefter behandles i applikationen .
Generel beskrivelse
I objektorienteret analyse er det sædvanligt at bruge tilstandsmodellen til at beskrive objekters dynamiske adfærd. [2]
En begivenhed er en overgang af et objekt fra en tilstand til en anden. Interaktionen mellem objekter udføres også ved hjælp af begivenheder: en ændring i tilstanden af et objekt fører til en ændring i tilstanden af et andet objekt, og begivenheden viser sig at være et middel til kommunikation mellem objekter.
Ifølge [2] er en begivenhed "en abstraktion af en hændelse eller et signal i den virkelige verden, der fortæller os, at noget er flyttet til en ny tilstand." Yderligere skelnes der mellem fire aspekter af begivenheden:
- etiket — entydig identifikator for begivenheden.
- værdi - en sms om essensen af det, der skete.
- destination - begivenhedsmodellen, der modtager begivenheden.
- data - data, der overføres fra et objekt til et andet.
Eksempler
Det første sæt eksempler på hændelser leveres af selve objektets livscyklus:
- skabelse af objekter;
- objekt ødelæggelse.
Mere komplekse eksempler på hændelser opstår, når et objekt har interne tilstande, der er beskrevet af et tilsvarende overgangsdiagram (fra en tilstand til en anden).
Begivenheder i .Net
Hændelser tillader en klasse eller et objekt at underrette andre klasser eller objekter, når visse situationer opstår. Klassen, der sender (eller rejser) en begivenhed, kaldes en udgiver, og de klasser, der modtager (eller håndterer) en begivenhed, kaldes abonnenter. Hændelser er delegerede forekomster, der er i stand til at gemme, tilføje og fjerne delegerede af samme type (hændelseshandlere). Når en begivenhed rejses, kaldes alle delegerede, der blev føjet til begivenheden. Hændelser kan kun kaldes fra den klasse eller det objekt, som hændelsen tilhører. [3]
Delegeret-begivenhedsmodel, der f.eks. bruges i udviklingen af grafiske grænseflader, er baseret på:
- kontrolobjektet, der er kilden til begivenhederne
- en observatør , også kaldet en hændelseshandler, der modtager hændelsesmeddelelser fra kilden
- grænseflader (i bredere forstand), der beskriver måden (protokol) for hændelsesudveksling.
Derudover kræver modellen, at:
- hver observatør har implementeret en grænseflade til de begivenheder, den ønsker at abonnere på
- hver observatør skal registrere sig hos kilden for at udtrykke en hensigt om at modtage begivenheder.
- hver gang kilden udsender en hændelse, sender den den videre til observatørerne ved hjælp af grænsefladeprotokollen.
I C#
delegere void Notifier ( strengsender ) ;
klasse Model {
public event Notifier notifyViews ;
public void Change () { ... notifyViews ( "Model" ); }
}
klasse View1 {
public View1 ( Model m ) {
m . notifyViews += ny notifier ( denne . Update1 );
}
void Update1 ( strengsender ) { Konsol . _ WriteLine ( afsender + " blev ændret under opdatering" ); } }
klasse View2 {
public View2 ( Model m ) {
m . notifyViews += ny notifier ( denne . Update2 );
}
void Update2 ( strengsender ) { Konsol . _ WriteLine ( afsender + "blev ændret" ); } }
klasse Test {
static void Main () {
Model model = new Model ();
newView1 ( model ) ; newView2 ( model ) ; model . Skift (); // Både Update1 og Update2 metoder vil blive kaldt. } }
I VB.NET
I VB.NET erklæres begivenheder med begivenhedsnøgleordet. Hvis delegattypen udelades, så vil compileren selv oprette den, som senere kan indeholde en reference til metoden implementeret i abonnenten.
Du kan implementere et begivenhedsabonnement på flere måder:
- evtSample As sampleDel - Mekanismen til registrering af en hændelseshandler for en given deklarationstype skal leveres af klassen med den erklærede hændelse. Hændelsen genereres ved at kalde en metode på evtSample delegaten.
- Public Event evtSample As sampleDel - En hændelseshandler kan registreres ved hjælp af AddHandler-sætningen, som vil binde kildehændelsen og metoden i abonnentklassen. Hændelsen implementeres ved hjælp af den sampleDel-erklærede delegerede. Hændelsen genereres ved hjælp af RaiseEvent-sætningen.
- Public Event evtSample - Hændelseshandleren vil blive registreret ved hjælp af WithEvents nøgleordet i klasseinstanserklæringen og Handles i selve abonnentklassemetodedeklarationen. En begivenhed implementeres ved hjælp af en implicit erklæret delegeret. Hændelsen genereres ved hjælp af RaiseEvent-sætningen.
Import system
Public Class CTimer
Delegeret Sub SecondDel ( ByVal xintTime As Integer )
Privat evt . Second As SecondDel
Offentlig begivenhed evtMinute As SecondDel
Offentlig begivenhed evtHour ( ByVal xHour As Integer )
public Shared lngSeconds As Long
Offentligt underregister ( ByVal objSecond As SecondDel ) evtSecond = evtSecond . _ Kombiner ( evtSecond , objSecond ) End Sub
Offentlig Sub OnTimer (
) lngSeconds = lngSeconds + 1
If lngSeconds Mod 5 = 0 Then
evt . _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ Så RaiseEvent evtHour ( lngSeconds ) 'Raise event End If End Sub
slutklasse _
Offentlig klasse CClock
Private WithEvents mobjTimer Som CTimer 'Class objekterklæring, med mulighed for at oprette forbindelse til begivenheder
Sub New ()
mobjTimer = New CTimer ()
mobjTimer . Registrer ( Ny CTimer . SecondDel ( AddressOf SecondEvent )) 'Tilmeld en begivenhed via metoden leveret af
AddHandler mobjTimer -klassen . evtMinute , AddressOf MinuteEvent ' Log af en begivenhed med AddHandler
While ( mobjTimer . lngSeconds < 60 )
mobjTimer . OnTimer ()
System . trådning . tråd . 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 ( "Minutes begivenhed" )
End Sub
'Registrering af en begivenhed ved hjælp af nøgleordet Handles
Private Sub mobjTimer_evtHour ( ByVal xintTime As Integer ) Håndterer mobjTimer . evtHour
Console . WriteLine ( "Timens begivenhed" )
End Sub
Offentlig delt underhoved ( ) Dim cc1 = Ny CClock ( ) Slutunder
slutklasse _
Se også
Links
Noter
- ↑ Begivenheder ligner interrupts i denne forstand .
- ↑ 1 2 Se [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. marts 2002) . Hentet 5. august 2011. Arkiveret fra originalen 20. september 2011. (ubestemt)
Litteratur
- Schleer S, Mellor S. Objektorienteret analyse: modellering af verden i stater: Pr. fra engelsk. - Kiev: Dialektik, 1993. - 240 s: ill.