View
212
Download
0
Category
Preview:
DESCRIPTION
some words about csharp event handling
Citation preview
Vizulis s esemnyvezrelt programozs 20062007, II. flvBMF NIK
Mikls rpd, BMF NIK, 20062007miklos.arpad@nik.bmf.hu
Esemnykezels
A kpvisel (delegate)Kpviselk C# nyelvi megvalstsaMetdushvs kpviseln keresztlAz esemny (event)Esemny kzztteleEsemnykezel ltrehozsaFeliratkozs esemnyre
2007. mrcius 21. 2V1.2 Mikls rpd, BMF NIK, 20062007
miklos.arpad@nik.bmf.hu
Hallgati tjkoztat
A jelen bemutatban tallhat adatok, tudnivalk s informcik a szmonkrend anyag vzlatt kpezik. Ismeretk szksges, de nem elgsges felttele a sikeres zrthelyinek, illetve vizsgnak.
Sikeres zrthelyihez, illetve vizsghoz a jelen bemutat tartalmn fell a ktelez irodalomknt megjellt anyag, a gyakorlatokon szban, illetve a tbln tadott tudnivalk ismerete, valamint a gyakorlatokon megoldott pldk s az otthoni feldolgozs cljbl kiadott feladatok nll megoldsnak kpessge is szksges.
2007. mrcius 21. 3V1.2 Mikls rpd, BMF NIK, 20062007
miklos.arpad@nik.bmf.hu
A kpvisel (delegate)
A kpvisel egy specilis nyelvi elem, melynek segtsgvel egy osztlyhoz kls osztlyok kapcsoldhatnak
A kpvisel (ms kifejezssel metdusreferencia vagy deleglt) elrja az osztlyok kztti zenetek formtumt. Ez a formtum tulajdonkppen az zenetvltshoz hvand metdus szignatrja, mivel az zenetvlts OOP rendszerekben ltalban metdushvsknt valsul meg.
Tetszleges kls osztly kapcsoldhat kpviseln keresztl egy msik osztlyhoz, ennek egyetlen felttele az elrt formtum betartsa.
Kpviselk segtsgvel egy osztly metdusai kls osztlyok metdusait ismeretlenl is meg tudjk hvni
A kpviselk teht kzvettenek a hv s a hvott osztly kztt. Fbb felhasznlsi terleteik:
zenetkldsi lehetsg kls osztlyok rszre
Mg nem is ltez osztlyok metdusainak hvsa (univerzlis visszahvsi funkci, rtestsi funkci)
2007. mrcius 21. 4V1.2 Mikls rpd, BMF NIK, 20062007
miklos.arpad@nik.bmf.hu
Maguk a kpviselk specilis (idegen metdusok trolsra alkalmas) osztlyok
Kpviselk a delegate kulcssz segtsgvel, sajt nvvel s az ltaluk kpviselhet metdusok szignatrjval deklarlhatk.
A kpvisel osztly pldnyostsa gy trtnik, hogy konstruktornak t kell adni paramterl egy, a kpviselnek megfelel szignatrj metdust. (!)
Kpviselk C# nyelvi megvalstsa
public delegate void EventHandler(object sender, EventArgs e);
Visszatrsi rtk tpusa
Paramterlista tpusokkal
Az EventHandler tpus pldnyai ltal kpviselhet metdusok szignatrja (a paramterek neve nem lnyeges)
public EventHandler EH = new EventHandler(eventHandlerMethod); E metdus szignatrja azonos vagy kompatibilis kell, hogy legyen
a fent megadott szignatrval*
* Az tadott metdus visszatrsi rtknek tpusa a kpviselnl megadott tpus vagy annak brmely leszrmazottja lehet (kovariancia), paramtereinek tpusa pedig a kpviselnl megadott tpus vagy annak brmely se lehet (kontravariancia).
2007. mrcius 21. 5V1.2 Mikls rpd, BMF NIK, 20062007
miklos.arpad@nik.bmf.hu
delegate double Kzvett(double d);
static class Mveletek{
public static double Ktszerezs(double szm){ return szm + szm; }
public static double NgyzetreEmels(double szm){ return szm * szm; }
}
class Program{
static void Main(){
Kzvett[] mveletek = new Kzvett[] { new Kzvett(Mveletek.Ktszerezs), new Kzvett(Mveletek.NgyzetreEmels) };
foreach (Kzvett k in mveletek)System.Console.WriteLine( k(2.5) );
}}
delegate double Kzvett(double d);
static class Mveletek{
public static double Ktszerezs(double szm){ return szm + szm; }
public static double NgyzetreEmels(double szm){ return szm * szm; }
}
class Program{
static void Main(){
Kzvett[] mveletek = new Kzvett[] { Mveletek.Ktszerezs, Mveletek.NgyzetreEmels };
foreach (Kzvett k in mveletek)System.Console.WriteLine( k(2.5) );
}}
Metdushvs kpviseln keresztl (1)Egyszer metdushvs
2007. mrcius 21. 6V1.2 Mikls rpd, BMF NIK, 20062007
miklos.arpad@nik.bmf.hu
A kpvisel ltrehozsakor paramterknt tadott metdus s az utlag a += opertorral tadott metdus hvsa egyms utn
Metdushvs kpviseln keresztl (2)Tbb metdus felfzse (multicast)
delegate void Feldolgoz(string szveg);
class Program{
static void KirsNagybetkkel(string s){ System.Console.WriteLine( s.ToUpper() ); }static void KirsKisbetkkel(string s){ System.Console.WriteLine( s.ToLower() ); }static void Main(){
Feldolgoz f = new Feldolgoz(KirsNagybetkkel);f += new Feldolgoz(KirsKisbetkkel);
f("A kpviseln keresztl futottam le.");System.Console.WriteLine();KirsNagybetkkel("Egyszer metdushvssal futottam le.");
}}
Feldolgoz f = new Feldolgoz(KirsNagybetkkel);f += new Feldolgoz(KirsKisbetkkel);
2007. mrcius 21. 7V1.2 Mikls rpd, BMF NIK, 20062007
miklos.arpad@nik.bmf.hu
Metdushvs kpviseln keresztl (3)Kpvisel tpus paramterek
delegate bool sszehasonlt(object bal, object jobb);
class EgyszerCsersRendez{
public static void Rendez(object[] rendezendTmb, sszehasonlt nagyobb){
for (int i = 0; i < rendezendTmb.Length; i++)for (int j = i + 1; j < rendezendTmb.Length; j++)
if ( nagyobb(rendezendTmb[j], rendezendTmb[i]) ){
object ideiglenes = rendezendTmb[i];rendezendTmb[i] = rendezendTmb[j];rendezendTmb[j] = ideiglenes;
}}
}
2007. mrcius 21. 8V1.2 Mikls rpd, BMF NIK, 20062007
miklos.arpad@nik.bmf.hu
Az esemny (event)
Az esemny egy kifejezetten rtestsi cl nyelvi elem (valjban egy korltozott, biztonsgosabb tett kpvisel)
Az esemnyek segtsgvel valsul meg a kls osztlyok rtestse.
Az rtestsi folyamat ltalnos menete:1. Az esemnyt rtestsi cllal felknl osztly kzzteszi az esemnyt
A kzztev osztly erre a clra egy megfelel kpvisel tpus nyilvnos mezt deklarl.
2. Az esemny irnt rdekld osztlyok egy sajt metdus tadsval feliratkoznak az esemnyt kzztev osztlynl
A feliratkozs sorn az osztlyok egy-egy elre elksztett, meghatrozott szignatrjmetdust (n. esemnykezelt) adnak t paramterknt a kzztev osztlynak.
A feliratkozs az esemny += opertornak segtsgvel trtnik, emellett utlagos leiratkozsra is van lehetsg a -= opertorral.
Az esemny alapjul szolgl kpvisel sajt listban tartja nyilvn a feliratkozsok sorn a += s a -= opertorokkal fel-, illetve leiratkozott metdusokat.
3. A kzztev osztly valamely metdusban kivltdik az esemnyA bekvetkezett esemnyrl a kzztev osztly (a kpvisel segtsgvel) a feliratkozs sorn megadott esemnykezel metdusok hvsval rtesti a feliratkozott osztlyokat.
2007. mrcius 21. 9V1.2 Mikls rpd, BMF NIK, 20062007
miklos.arpad@nik.bmf.hu
A kzztett esemnyek specilis mezk*, amelyek az event kulcssz segtsgvel, sajt nvvel s a megfelel kpvisel (mint
alaptpus) megnevezsvel adhatk meg
Az esemnymezk rtke az alaptpusukknt szolgl kpvisel egy pldnya, amelyek a megfelel szignatrj metdusok tadsval jn ltre. A kpvisel ltrehozshoz feliratkozskor a += opertorral, leiratkozskor a -= opertorral kell a kvnt metdust a mez rtkl megadni.
A kls felhasznl osztlyok szmra kzztett esemnyek ltalban nyilvnos (public), a leszrmazottak szmra ksztett bels esemnyek ltalban vdett (protected) lthatsgak.
Esemny kzzttele
public event EventHandler Load;
Az esemny alaptpusul szolgl kpvisel
* Valjban az esemnyekhez sajt fel- s leiratkozsi (add, illetve remove) metdusok is kszthetk egyni trolsi megoldssal, teht az esemnyek szemantikja a mezk helyett inkbb a tulajdonsgokhoz hasonlt, melyek szintn sajt elrsi metdusprral rendelkeznek. A fenti lers az egyszerbb, a gyakorlatban jellemzen hasznlt esetet veszi alapul.
2007. mrcius 21. 10V1.2 Mikls rpd, BMF NIK, 20062007
miklos.arpad@nik.bmf.hu
using System;using System.Windows.Forms;
namespace WindowsApplication1{
public partial class Form1 : Form{
public Form1(){
InitializeComponent();}
}}
Esemnykezel ltrehozsa
Form1.cs
private void Form1_Load(object sender, EventArgs e){
this.Text = "Hello, C# World";}
2007. mrcius 21. 11V1.2 Mikls rpd, BMF NIK, 20062007
miklos.arpad@nik.bmf.hu
#region Windows Form Designer generated code
/// /// Required method for Designer support - do not modify/// the contents of this method with the code editor./// private void InitializeComponent(){
this.SuspendLayout();//// Form1//this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 14F);this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;this.ClientSize = new System.Drawing.Size(292, 272);this.Name = "Form1";this.Text = "Form1";
this.ResumeLayout(false);}#endregion
Feliratkozs esemnyre
Form1.Designer.cs
this.Load += new System.EventHandler(this.Form1_Load);
Recommended