V 1.0 OE-NIK HP 1 Programozási Paradigmák és Technikák Eseménykezelés Névtelen metódusok (anonymous methods)

Slides:



Advertisements
Hasonló előadás
C# nyelvi áttekintő A „Programozás C# nyelven (Illés Zoltán)”
Advertisements

Krizsán Zoltán iit 1.1.  Aszinkron történésről értesítés egy vagy több objektum számára.  Delegátumok segítségével valósítja meg a C#.  event típus,
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
Programozás III KOLLEKCIÓK 2..
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
Öröklődés 2..
© Kozsik Tamás Tömbök, kollekciók és egyéb alaposztályok.
© Kozsik Tamás Beágyazott osztályok A blokkstrukturáltság támogatása –Eddig: egymásba ágyazható blokk utasítások Osztálydefiníciók is egymásba.
Csala Péter ANDN #4. 2 Tartalom  C# - ban előre definiált típusok  Változók  Változókkal műveletek  Elágazás  Ciklus.
Bevezetés a Java programozásba
4. előadás (2005. március 8.) Pointerek Pointer aritmetika
Programozás II. 3. Gyakorlat C++ alapok.
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Programozás II. 6. Gyakorlat const, static, dinamikus 2D.
Tömbök ismétlés Osztályok Java-ban Garbage collection
A Java programozási nyelvSoós Sándor 1/17 Java programozási nyelv 4. rész – Osztályok II. Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai.
Java programozási nyelv 3. rész – Osztályok I.
A C++ programozási nyelvSoós Sándor 1/10 C++ programozási nyelv Gyakorlat - 5. hét Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai Intézet.
A C++ programozási nyelvSoós Sándor 1/15 C++ programozási nyelv Gyakorlat hét Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai Intézet.
C# tagfüggvények.
C# tagfüggvények.
Krizsán Zoltán iit 1.2.  Nem kell vizuális felületnek lennie.  Delegátumok segítségével valósíthatja meg a.NET. Krizsán Zoltán iit Delegátumok C#-ban2.
V 1.0 Szabó Zsolt, Óbudai Egyetem, Haladó Programozás Eseménykezelés ismétlés Névtelen metódusok (anonymous methods)
© Kozsik Tamás Csomagok. © Kozsik Tamás A program tagolása Típusdefiníciók (osztályok, interfészek) Metódusok Blokk utasítások Csomagok.
A JAVA TECHNOLÓGIA LÉNYEGE Többlépcsős fordítás A JAVA TECHNOLÓGIA LÉNYEGE Platformfüggetlenség.
Lambda kifejezések LINQ
V 1.0 ÓE-NIK, Programozás I. A Microsoft Visual Studio 2010 használata.
Összetett adattípusok
Szoftvertechnológia alapjai Java előadások Förhécz András, doktorandusz tárgy honlap:
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
Hernyák Zoltán Programozási Nyelvek II.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
Hernyák Zoltán Programozási Nyelvek II.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
1 Hernyák Zoltán Web: Magasszintű Programozási Nyelvek I. Eszterházy.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
1 Hernyák Zoltán Web: Magasszintű Programozási Nyelvek I. Eszterházy.
1 Hernyák Zoltán Web: Magasszintű Programozási Nyelvek I. Eszterházy.
1 Hernyák Zoltán Web: Magasszintű Programozási Nyelvek I. Eszterházy.
Javascript Microsoft által készített kiegészítése Statikus típusosság Nagy projektek Windows 8 fejlesztésénél WinRT egy részét ebben írták Nyílt forráskódú,
V 1.0 Szabó Zsolt, Óbudai Egyetem, Programozási Paradigmák és Technikák Programozási eszközök Interfészek Generikus.
V 1.0 Szabó Zsolt, Óbudai Egyetem, Programozási Paradigmák és Technikák Programozási eszközök Interfészek Generikus.
Visual Basic 2008 Express Edition
Generics Krizsán Zoltán. Bemutató A.NET 2.0 verziótól. A.NET 2.0 verziótól. Típusparaméter Típusparaméter Más nyelvben ez a template (sablon). Más nyelvben.
Programozás III KOLLEKCIÓK.
Objektum orientált programozás
Programozás I. Matematikai lehetőségek Műveletek tömbökkel
V 1.0 ÓE-NIK-AII, Programozás I. Karaktersorozatok Feladatok.
A Visual Basic nyelvi elemei
Programozás III KOLLEKCIÓK.
Függvények a C nyelvben 1 Függvényeket a következő esetekben szokás írni: Ha ugyanazt a tevékenységet többször is el kell végeznünk ugyanolyan típusú,
Haladó Programozás Delegáltak, események OE-NIK HP 1.
DLL használata és készítése Feladat
Szebb és használhatóbb programok Vezérlőelemek dinamikus felhelyezése.
1Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor Programozás I. 6. gyakorlat.
TÁMOP /1-2F Informatikai gyakorlatok 11. évfolyam Windows Forms alkalmazás készítése Czigléczky Gábor 2009.
TÁMOP /1-2F JAVA programozási nyelv NetBeans fejlesztőkörnyezetben I/13. évfolyam Osztályok, objektumok definiálása és alkalmazása. Saját.
V 1.01 Szoftverfejlesztés párhuzamos és elosztott környezetben Generikus típusok Delegáltak Anonim függvények Lambda kifejezések GUI készítése.
Eseménykezelés ismétlés Névtelen metódusok (anonymous methods)
Neumann János Informatikai Kar
Lambda kifejezések LINQ
Hernyák Zoltán Magasszintű Programozási Nyelvek I.
Hernyák Zoltán Programozási Nyelvek II.
Web programozás és haladó fejlesztési technikák – C#
Web programozás és haladó fejlesztési technikák – C#
Dependency Injection Tesztduplikátumok, Mock-ok, Fake-ek Feladat
JAVA programozási nyelv NetBeans fejlesztőkörnyezetben I/13. évfolyam
Előadás másolata:

V 1.0 OE-NIK HP 1 Programozási Paradigmák és Technikák Eseménykezelés Névtelen metódusok (anonymous methods)

V 1.0 OE-NIK HP 2 A prezentációban eseményt kiváltó és eseményt feldolgozó osztályról beszélünk, de eseménykezelés lehetséges akár egyetlen osztályon belül is Cél: esemény bekövetkezésének jelzése más modul/osztály részére Módszerek: Függvénymutató átadása (DOS), Delegate-ek használata (C#), Interfészek használata (JAVA) Eseménykezelés

V 1.0 OE-NIK HP 3 Adott egy eseményt leíró IValami interface, ami rögzíti az esemény leírásához szükséges adatokat és az előírt metódusnevet Egy osztály (eseményt kiváltó/küldő osztály) egy listát tart karban, amelyben IValami típusú referenciákat tárol Publikus eljárások segítségével egy másik osztálynak (eseményt lekezelő osztály) lehetősége van ezen listához példányt hozzáadni, illetve törölni (feliratkozni / leiratkozni) A listához hozzáadott példány IValami típusú  van benne egy Valami() nevű metódus, ami az eseményt lekezelő osztály kívánságainak megfelelően lekezeli az eseményt Az eseményt kiváltó osztály egyszerűen végigmegy a listában szereplő (eseményre feliratkozott) IValami példányokon, és mindegyiknek meghívja a Valami() nevű metódusát Interface-ek használata eseménykezeléshez

V 1.0 OE-NIK HP 4 Egy típus, amelybe metódusokat tudunk „belerakni” A deklarációnál meg kell kötni, hogy milyen szignatúrájú metódust tud tárolni az adott delegate: delegate double MyDelegate(int param1, string param2); –Név: MyDelegate –Visszatérési típus: double –Paraméterek: 2 db, int+string Fontos: ez még csak egy típusdeklaráció  –Változó nélkül nem használható –Referenciatípus –Metóduson belül nem deklarálható –Osztályon belül és kívül is deklarálható Delegate

V 1.0 OE-NIK HP 5 delegate double MyDelegate(int param1, string param2); double funct(int elso, string masodik) { return elso + masodik.Length; } Más metóduson belül: MyDelegate del; del = new MyDelegate(funct); Console.WriteLine(del(5, "hello")); Delegate használata

V 1.0 OE-NIK HP 6 delegate double MyDelegate(int param1, string param2); double funct(int elso, string masodik) { return elso + masodik.Length; } Osztály deklarációs részében (metódusokon kívül): –MyDelegate del; Más metóduson belül: –del += funct; Console.WriteLine(del(5, "hello")); –Amíg nem rakunk a delegate-be metódust, az értéke NULL  hívás előtt ellenőrizni kell! –Lehetséges több metódust belerakni egy delegate-be Delegate használata

V 1.0 OE-NIK HP 7 delegate bool Összehasonlító(object bal, object jobb); class EgyszerűCserésRendező { public static void Rendez(object[] Tömb, Összehasonlító nagyobb) { for (int i = 0; i < Tömb.Length; i++) for (int j = i + 1; j < Tömb.Length; j++) if (nagyobb(Tömb[j], Tömb[i])) { object ideiglenes = Tömb[i]; Tömb[i] = Tömb[j]; Tömb[j] = ideiglenes; } Delegate-paraméter

V 1.0 OE-NIK HP 8 Delegate-paraméter példaosztály class diak { public string nev; public int kreditek; public diak(string ujnev, int ujkreditek) { nev = ujnev; kreditek = ujkreditek; } public override string ToString() { return nev + " - " + kreditek; } diak[] csoport = new diak[] { new diak("Első Egon", 52), new diak("Második Miksa", 97), new diak("Harmadik Huba", 10), new diak("Negyedik Néró", 89), new diak("Ötödik Ödön", 69) };

V 1.0 OE-NIK HP 9 Delegate-paraméter kód bool mycomp(object elso, object masodik) { return ((elso as diak).kreditek < (masodik as diak).kreditek); } Összehasonlító del = new Összehasonlító(mycomp); EgyszerűCserésRendező.Rendez(csoport, del); VAGY EgyszerűCserésRendező.Rendez(csoport, mycomp);

V 1.0 Eseménykezelés OE-NIK HP 10 Eddig: tudunk egy osztályon belül delegate-et deklarálni, és használni Cél: osztályok közötti átjárhatóság  funkcionalitás szempontjából a delegate erre jó, a delegate típusnál csak a metódus szignatúrája számít, az azt tartalmazó osztály nem Gyakorlatilag az eseményt kiváltó osztályban egy publikus delegate típusú változó kell Az „event” kulcsszót használjuk annak jelzésére, hogy ez egy esemény lesz –Szerepelhet interface-ben (sima delegate változó nem) –Meghívni csak a tartalmazó osztályból lehet (sima publikus delegate-et bárhonnan) –Kötött szignatúra: void visszatérési típus, Sender + EventArgs paraméter

V 1.0 OE-NIK HP 11 Az eseményt lekezelő osztályból rakunk bele egy metódust az eseményt kiváltó osztály delegate-jébe (csak += és -= operátorok!) Vagyis, ha meghívjuk a delegate-et  a külső metódust hívjuk meg Fontos: –Az eseményt kiváltó osztályban az esemény-delegate meghívásakor nem tudjuk, hogy a delegate tartalmaz-e metódust (vagyis: nem tudjuk, hogy rendeltek-e eseménykezelőt az eseményhez) –Ezért a delegate meghívása előtt mindig figyelni kell a NULL értéket –Lehetőség van egy eseményhez több eseménykezelőt is rendelni, bár ez a Visual Studio tervező nézetében nem megoldott Eseménykezelés

V 1.0 OE-NIK HP 12 Eseménykezelés – Névkonvenciók FeladatNévElhelyezés EseményparaméterValamiEventArgsA névtérben vagy a kiváltó osztályban DelegateValamiEventHandlerA névtérben vagy a kiváltó osztályban EseményValamiKiváltó osztályban Eseményt közvetlenül meghívó metódus OnValamiKiváltó osztályban Esemény lekezelése---Lekezelő osztályban

V 1.0 OE-NIK HP 13 Hozzunk létre egy egyszerű demonstrációs alkalmazást, amivel form-példányok tudnak egymással kommunikálni A kommunikációra használjunk egy közös statikus osztályt (ChatServer), amely eseményeken keresztül értesíti a form- példányokat a beérkezett üzenetekről Oldjuk meg a feladatot interface-ek és delegate használatával is! Eseménykezelés feladat

V 1.0 OE-NIK HP 14 Hozzunk létre Windows Forms alkalmazást, benne a korábban említett Diák {Név, Kreditek} osztállyal Legyen lehetőségünk diákok felvitelére, a felvitt diákok jelenjenek meg egy ListBox vezérlőben Az egyes diákoknak gomb segítségével tudjuk növelni a kreditszámát A diák osztályban következzen be a PrímaDiák esemény, ha a kreditszám-változás után a kreditek száma prímszám Az esemény küldője a kiváltó példány legyen, eseményparaméterként küldjük el az aktuális időt A Form osztályban iratkozzunk fel az eseményre, és a prím- diákokról vezessünk egy külön listát Eseménykezelés feladat

V 1.0 OE-NIK HP 15 Programozási Paradigmák és Technikák Eseménykezelés Névtelen metódusok (anonymous methods)

V 1.0 OE-NIK HP 16 Angolul: anonymous methods Célok: –Kód lerövidítése, olvashatóbbá tétele –Apró, „levegőben lógó” metódusok és eseménykezelők számának csökkentése –A metódussal való paraméterezés megkönnyítése, rövidítése –Ezáltal a létrehozott osztályok „általánosságának” növelése (az osztály működése is módosíthatóvá válik azáltal, hogy metódusokat adhatunk meg paraméterül) Névtelen metódusok

V 1.0 OE-NIK HP 17 Gyakori példa: dinamikus vezérlők létrehozásánál for (int x = 0; x < 5; x++) { for (int y = 0; y < 5; y++) { Button uj = new Button(); uj.Top = y * 50; uj.Left = x * 50; uj.Width = uj.Height = 40; uj.Text = x + ";" + y; Controls.Add(uj); uj.Click += new EventHandler(uj_Click); } } // Cél: Mindegyik gombra fusson le egy eseménykezelő

V 1.0 OE-NIK HP 18 Eseménykezelő írásának problémái Tipikusan: egy nagyobb programhoz több saját vezérlő, mindegyikben több saját osztály, több egyedi esemény van Probléma: Az események lekezelésekor minden eseménykezelő egy külön metódus, amik sokszor nagyon egyszerűek. Egy nagy programban rengeteg soros metódus kerül, ráadásul az eseménykezelő hozzárendelése (a += operátoros sor) és az eseménykezelő kódja távol kerül egymástól  külön deklarált metódusok helyett úgynevezett névtelen metódusokat használunk  „anonymous methods” Lényegük: a metódust nem deklaráljuk külön (ezért névtelen: nincs névvel deklarálva, csak kóddal), így egyszerűen megmondjuk, hogy „ha bekövetkezik az esemény, akkor tedd EZT”

V 1.0 OE-NIK HP 19 Gyakori példa: dinamikus vezérlők létrehozásánál Button uj = new Button(); uj.Top = y * 50; uj.Left = x * 50; uj.Width = uj.Height = 40; uj.Text = x + ";" + y; Controls.Add(uj); uj.Click += delegate { MessageBox.Show("CLICKED"); }; Záró pontosvessző !!!

V 1.0 OE-NIK HP 20 Gyakori példa: dinamikus vezérlők létrehozásánál Button uj = new Button(); uj.Top = y * 50; uj.Left = x * 50; uj.Width = uj.Height = 40; uj.Text = x + ";" + y; Controls.Add(uj); uj.Click += delegate(object kuldo, EventArgs esemenypar) { MessageBox.Show((kuldo as Button).Text); };

V 1.0 OE-NIK HP 21 Névtelen metódusok Előny: könnyebben olvasható kód (egyesek szerint ) Csak az egyszer használatos, és lehetőleg rövid eseménykezelőt írjuk így meg: a hosszú kód olvashatatlan, és mivel „beágyazott kód”, ezért nem újrafelhasználható Lehetőleg ne ágyazzunk egymásba névtelen metódusokat Használatukkal lehetőség van leegyszerűsíteni a korábban delegate-paraméterek használatát is

V 1.0 OE-NIK HP 22 delegate bool Összehasonlító(object bal, object jobb); class EgyszerűCserésRendező { public static void Rendez(object[] Tömb, Összehasonlító nagyobb) { for (int i = 0; i < Tömb.Length; i++) for (int j = i + 1; j < Tömb.Length; j++) if (nagyobb(Tömb[j], Tömb[i])) { object ideiglenes = Tömb[i]; Tömb[i] = Tömb[j]; Tömb[j] = ideiglenes; } Delegate-paraméter

V 1.0 OE-NIK HP 23 Delegate-paraméter példaosztály class diak { public string nev; public int kreditek; public diak(string ujnev, int ujkreditek) { nev = ujnev; kreditek = ujkreditek; } public override string ToString() { return nev + " - " + kreditek; } diak[] csoport = new diak[] { new diak("Első Egon", 52), new diak("Második Miksa", 95), new diak("Harmadik Huba", 10), new diak("Negyedik Néró", 84), new diak("Ötödik Ödön", 69) };

V 1.0 OE-NIK HP 24 Delegate-paraméter példa EgyszerűCserésRendező.Rendez(csoport, delegate(object elso, object masodik) { return (elso as diak).nev. CompareTo((masodik as diak).nev) < 0; }); EgyszerűCserésRendező.Rendez(csoport, delegate(object elso, object masodik) { return (elso as diak).kreditek < (masodik as diak).kreditek; });

V 1.0 OE-NIK HP 25 Programozási Paradigmák és Technikák Eseménykezelés ismétlés Névtelen metódusok (anonymous methods)

V 1.0 OE-NIK HP 26 Források Events tutorial: Event modifier: Anonymous methods: Anonymous methods: Anonymous methods: Anonymous methods: anonymous-methods-vs-formally-defined-methods Delegate, Anonymous, Event: Reiter István: C# jegyzet ( oldal

V 1.0 OE-NIK HP 27

28 OE-NIK HP