Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

Ismétlés Néhány fontosabb nyelvi elem. Tulajdonságok.

Hasonló előadás


Az előadások a következő témára: "Ismétlés Néhány fontosabb nyelvi elem. Tulajdonságok."— Előadás másolata:

1 Ismétlés Néhány fontosabb nyelvi elem

2 Tulajdonságok

3 J.Zs.Cs.: Vizuális programozás (c) 2013 Tulajdonságok Cél: Korlátozott láthatóságú adattagok beállítási/lekérdezési műveleteinek megoldása egyszerűbb (tömörebb) szintaktikával Számított értékű mező megvalósítása Mikor előnyös? Kevés kód szükséges a hozzáférés szabályozásához A kód nem virtuális

4 J.Zs.Cs.: Vizuális programozás (c) 2013 Elérők (accessors) Tulajdonságelérő "tagfüggvények" class Nyomógomb {private string Felirat; //a háttérben levő korlátozott hozzáférésű adattag public string NFelirat //az adattagot "közzétevő" tulajdonság, ez látható {get { return Felirat;} //lekérdező elérő set { if( value !=null && …) //ellenőrzött beállítás Felirat=value; }}…

5 J.Zs.Cs.: Vizuális programozás (c) 2013 Csak olvasható tulajdonság private int Szélesség; private int Magasság; … public int Terület //számított tulajdonság, nincs mögötte adattag {get {return Szélesség*Magasság; } } //a tulajdonság csak olvasható

6 J.Zs.Cs.: Vizuális programozás (c) 2013 Használat Nyomógomb ng=new Nyomógomb(); … ng.NFelirat="Ok"; //set elérő használata … int Ter=ng.Terület; //get elérő használata

7 J.Zs.Cs.: Vizuális programozás (c) 2013 Jellemzők Nem használható fel metódus ref vagy out paramétereként Nincs címe Lehet statikus Elfedheti ősosztály azonos nevű tagját (new) Lehet virtuális, absztrakt vagy override Megjelenhet egy interfészben

8 J.Zs.Cs.: Vizuális programozás (c) 2013 Jellemzők Nem lehet void A mögötte levő korlátozott láthatóságú tagokat lecserélhetjük a "kifele" mutatott tulajdonság cseréje nélkül Nem vehet át közvetlenül egynél több értéket

9 J.Zs.Cs.: Vizuális programozás (c) 2013 Tulajdonság típusok Írható-olvasható Csak olvasható Csak írható static: –Osztályszintű, csak az osztály statikus adataihoz fér hozzá, –Nem hivatkozhat a this-re vagy példány szintű tagokra –Nem lehet virtuális, absztrakt vagy override

10 J.Zs.Cs.: Vizuális programozás (c) 2013 Lazy creation Lazy instantiation, just-in-time creation A háttérben levő korlátozott hozzáférésű mező null kezdőértéket kap Igazi kezdőértéket a tulajdonsághoz történő első hozzáféréskor, pl. olvasáskor kapja meg a get-be beépített inicializáló kód útján

11 Automatikus tulajdonság (automatikusan implementált) J.Zs.Cs.: Vizuális programozás (c) 2013

12 Példaprogram Jelszóbekérő ablak

13 Indexelők

14 J.Zs.Cs.: Vizuális programozás (c) 2013 Indexelő Rokon vonásokat mutat a tulajdonságokkal és a C++ tömbindex operátor átdefiniálásával Cél: Egy objektumnév után illesztve a tömbindex operátort és indexként egy értéket megadva elérjük az objektum egy adattagját, vagy az adattagban tárolt adatok valamelyikét

15 J.Zs.Cs.: Vizuális programozás (c) 2013 Jellemzők Átdefiniálható más indextípust megadva Nem adható át ref vagy out paraméterként Nem lehet statikus

16 Példaprogram Asszociatív

17 Extension method Bővítő metódus Létező osztály kiterjesztése új metódussal az eredeti osztály módosítása nélkül Nem kell származtatott osztályt létrehozni (előnyös sealed osztályoknál) Meghívható az eredeti osztály objektumára J.Zs.Cs.: Vizuális programozás (c) 2013

18 Létrehozás J.Zs.Cs.: Vizuális programozás (c) 2013

19 Használat

20 J.Zs.Cs.: Vizuális programozás (c) Virtual példa J.Zs.Cs.: Vizuális programozás (c) 2013

21 Virtuális metódus Futási időben dől el, hogy az osztályhierarchián belüli virtuális metóduslánc melyik tagja hajtódik végre Virtuális metódus nem lehet private A virtual kulcsszó nem használható a static, abstract és override kulcsszavakkal együtt Ha definiálunk a leszármazott osztályban ugyanilyen paraméterszignatúrával egy metódust, akkor azt –a virtuális metóduslánc folytatásának tekintjük (override) –a lánctól független metódusnak tekintjük (new) –új virtuális lánc kezdetének tekintjük (new virtual)

22 J.Zs.Cs.: Vizuális programozás (c) 2013 virtual - override class Szülő {... public virtual int Metódus( ) {... } public virtual int AdatLekér(){ … } } class Gyerek: Szülő {... public override int Metódus( ) {... } public override int Metódus( ) {... } new public int AdatLekér(){ … } }

23 J.Zs.Cs.: Vizuális programozás (c) 2013 override A felüldefiniált metódus virtuális vagy absztrakt kell legyen Az override nem változtathatja meg az elem elérési szintjét (public, protected) Nem használható a new, static, virtual, abstract kulcsszavak együtt

24 J.Zs.Cs.: Vizuális programozás (c) 2013 new new-val virtuális metódus is definiálható (a bázis osztályban nem volt virtuális, de az aktuális osztályban és annak leszármazottaiban az) new-val adattag és leszármazott osztály is elfedhető Öröklött metódus vagy adattag elfedése: new kulcsszó

25 Lambda kifejezés Egyszerű eszköz inline (névtelen)metódus megvalósítására A fordító egy névtelen metódussal fogja helyettesíteni Implicit típusdef. a parlistában: –(paraméterlista)=>{utasítások} –paraméter=>utasítás Explicit típusdef a parlistában: –(int i)=>3*i J.Zs.Cs.: Vizuális programozás (c)

26 Lambda kifejezés és implicit típusdefiníció használata Random R=new Random(); List L=new List (); for (int i = 0; i < 20; i++) L.Add(R.Next(1000)); L.Add(R.Next(1000)); var Páratlanok = L.FindAll(Páratlan); Console.WriteLine("Páratlan számok: " +List2Str(Páratlanok)); +List2Str(Páratlanok)); var Párosok = L.FindAll(i => i%2==0); Console.WriteLine("Páros számok: " + List2Str(Párosok)); List2Str(Párosok)); J.Zs.Cs.: Vizuális programozás (c) 2013

27 Objektum inicializálás J.Zs.Cs.: Vizuális programozás (c) 2013

28 Metódusreferencia és eseménykezelés

29 J.Zs.Cs.: Vizuális programozás (c) 2013 Metódusreferencia (delegate) Egy speciális változó, ami objektum jegyekkel is rendelkezik Egy metódusra történő hivatkozást tárol, rajta keresztül hívható meg a metódus Funkcióját tekintve hasonló a C++ függvénycímet tárolni képes mutatójához Tartalma futási időben változtatható, különböző időpontokban más és más metódust – akár különböző osztályok tagjait – hívhatunk meg ugyanazon a metódusreferencián keresztül Objektum tag és statikus osztálytag metódus egyaránt meghívható

30 J.Zs.Cs.: Vizuális programozás (c) 2013 Alkalmazás - cél Pl. több osztály/objektum eltérő nevű, de azonos paraméterlistájú és visszatérési értékű metódussal rendelkezik A feladat az, hogy ezeket felváltva, vagy egymás utáni sorozatban meghívjuk A meghívó metódus olyan kell legyen, hogy a rendszer újabb osztályokkal történő bővítése ne igényeljen jelentős kódmódosítást

31 J.Zs.Cs.: Vizuális programozás (c) 2013 Megoldás Egy tömböt/listát hozunk létre, aminek elemei metódusreferenciák lesznek Amikor –egy új objektummal –egy új statikus metódussal bővül a rendszerünk, létrehozunk egy metódusreferenciát, amiben tároljuk az új objektumban (v. osztályban) meghívni kívánt metódus referenciáját, majd a metódusreferenciát felvesszük a listába

32 J.Zs.Cs.: Vizuális programozás (c) 2013 Lépések Metódusreferencia típus deklarálása public delegate visszértéktip MetódusReferenciaTípusNév(paraméterlista); Metódusreferencia típusú változó definiálása MetódusReferenciaTípusNév MVáltozó; Metódusreferencia objektum létrehozása MVáltozó=new MetódusReferenciaTípusNév( objektumnév.metódusnév); objektumnév.metódusnév: meghívandó metódus neve Metódus meghívása: MVáltozó(aktuális paraméterek);

33 Metódusreferencia példaalkalmazás J.Zs.Cs.: Vizuális programozás (c) 2013

34 Esemény Lehetővé teszi, hogy egy objektum más objektumokat értesítsen egy változásról Két szereplő (objektum) típust különböztetünk meg: –Közzétevő (publisher): előidéz egy eseményt, hogy értesítse az összes érdekelt – feliratkozott (subscriber) objektumot –Feliratkozó (subscriber): megad egy metódust, amit meg kell hívni egy esemény bekövetkeztekor, regisztrálja magát közzétevőnél Egy eseményre többen is feliratkozhatnak, de az is előfordulhat, hogy nincs érdeklődő Megvalósítás: metódusreferenciák segítségével

35 J.Zs.Cs.: Vizuális programozás (c) 2013 Megvalósítás Metódusreferencia típus definiálása public delegate void MTípusNév(paraméterlista); a visszatérési érték típusa void kell legyen A metódusreferencia típuson alapuló esemény definiálása public event MTípusNév EseményNév;

36 J.Zs.Cs.: Vizuális programozás (c) 2013 Megvalósítás Feliratkozás az eseményre az eseménykezelő metódus megadásával EseményNév+=new MTípusNév(objnév.esemkeznév) VagyEseményNév+=objnév.esemkeznévVagyEseményNév+=osztnév.esemkeznév

37 J.Zs.Cs.: Vizuális programozás (c) 2013 Esemény előidézése … if(EseményNév!=null) //ha van feliratkozó EseményNév(this);… Meghívja sorban az egyes eseménykezelőket A sorrend nem biztos Ha közben kivétel keletkezik, akkor a még „várakozó” eseménykezelők meghívása elmaradhat

38 J.Zs.Cs.: Vizuális programozás (c) 2013 Paraméterek átadása Első paraméter konvencionálisan a közzétevő objektum:object sender, mert egy eseménykezelő több objektum eseményeire is figyelhet A további paramétereket egy objektum adattagjaiként kell átadni, ennek osztálya az EventArgs leszármazottja kell legyen Létre kell hozni hozzá egy osztályt

39 Röviden a.Net platformról

40 J.Zs.Cs.: Vizuális programozás (c) 2013 Mit nyújt? biztosítja az eszközöket osztott web alkalmazások fejlesztéséhez nyelvfüggetlen programozási modellt biztosít támogatja a web-es protokollokat (HTTP, XML, XPath, SOAP) ingyenesen letölthető egységes felület, egyazon osztályhierarchia több nyelvből is elérhető egy alkalmazás különböző részeit más célorientált nyelveken is írhatják különböző nyelvekben járatos programozók „olcsón” (kis ráfordítással) képesek együttműködni egy projektben – RAD megvalósítása

41 A.NET fejlesztői platform Common Language Runtime Base Class Library Windows Forms ASP.NETADO.NET.NET 2.0 WPFWCFWWF WCS LINQ Entity framework J.Zs.Cs.: Vizuális programozás (c) 2013

42 Common Language Runtime Osztálybetöltő IL  Natív JIT-fordítók Biztonsági motor Hibakereső motor Típusellenőrző Kivételkezelő Szálkezelő COM Marshaler Osztálykönyvtár-kiszolgálás Szemétgyűjtő Kódkezelő Forrás: [1]

43 J.Zs.Cs.: Vizuális programozás (c) 2013 Használat a programok futtatásához szükség van a keretrendszerre (.Net Framework) a MS jelenleg saját operációs rendszereire fejleszti MS Rotor - FreeBSD Mono (www.go-mono.com) DotGnu (www.gnu.org/projects/dotgnu) 0.1

44 J.Zs.Cs.: Vizuális programozás (c) 2013 Fordítás - futtatás A fordítási folyamat eredményeképpen keletkező állomány megtévesztő módon exe kiterjesztést visel, de ez egy bájtkód MS Intermediate Language-ben végrehajtáskor egy JIT fordító állítja elő ebből a gépi kódot

45 J.Zs.Cs.: Vizuális programozás (c) 2013 Végrehajtás Fordítás Felügyelt kód Fordítás és végrehajtás Forrás kód (.cs,.vb, …) Nyelvi fordító JIT fordító Telepítéskor vagy a metódus első meghívásakor Kód (IL) + Metaadatok (.dll,.exe) Natív kód Szerelvény Forrás: [1]

46 J.Zs.Cs.: Vizuális programozás (c) 2013 Robosztus és biztonságos Felügyelt kód Felügyelt köztes kód: –Ellenőrizhető –Kötelező metainformációk –Processzor és architektúra független –Kiértékelő verem alapú –A kód szigorú típusellenőrzésnek vethető alá –Megszűnnek a leggyakoribb hibaforrások ellenőrizetlen veszélyes típusváltások, mutatóbűvészkedések inicializálatlan változók, tömbből kilógó indexek Kivételkezelés –Nyelvi szinten és a CLR-ben definiált hibakezelés –Integrálódik a Windows strukturált kivételkezelésével is (SEH) Forrás: [1]

47 J.Zs.Cs.: Vizuális programozás (c) 2013 Robosztus és biztonságos Felügyelt adatok Felügyelt adat –Automatikus élettartam-felügyelet –Minden.NET objektumot a GC takarít el GC: garbage collector – a szemetes –Nincs elfelejtett mutató vagy korai delete hívás a cirkuláris hivatkozások nem okoznak gondot –Modern, önhangoló GC algoritmusok a felhasználói interfész nem akad meg jó szerver oldali átbocsátóképesség Forrás: [1]

48 J.Zs.Cs.: Vizuális programozás (c) 2013 Fejlesztőeszközök Elvileg akár a jegyzettömbben is megírhatjuk programunkat, és lefordíthatjuk azt a keretrendszerbe beépített csc nevű fordítóval SharpDevelop 3. 2 – a C# és a VB.NET projektekhez MonoDevelop 2. 2

49 J.Zs.Cs.: Vizuális programozás (c) 2013 SharpDevelop

50 J.Zs.Cs.: Vizuális programozás (c) 2013ILDASM Start menü/Programok/ Microsoft Visual Studio 2008/ Visual Studio Tools/ Visual Studio 2008 Command Prompt

51 J.Zs.Cs.: Vizuális programozás (c) 2013.Net Reflector Lutz Roeder

52 J.Zs.Cs.: Vizuális programozás (c) 2013 [1] Albert István: Többrétegű architektúrák.NET platformon ed.aspx?NewsId=7365f ee-97c1-74f3f73fe65a

53 53 Windows 8 platform Communication & Data Devices & Printing WinRT APIs Graphics & Media Desktop Apps C C++ Win32 C# VB. NET & SL HTML JavaScrip t IE 10 Metro style Apps Application Model XAML JavaScript HTML / CSS C++ C# VB Windows Kernel Services DirectX

54 54 Desktop alkalmazások.NET 4.5 (C#, VB) –WPF 4.5 –Silverlight 5 –XNA –WinForms C/C++ Win32 Web –HTML, JS –IE 10 Stb... Communication & Data Devices & Printing WinRT APIs Graphics & Media Desktop Apps C C++ Win32 C# VB.NE T HTML JavaScrip t IE 10 Metro style Apps Application Model XAML JavaScript HTML / CSS C++ C# VB Windows Kernel Services DirectX

55 55 Metro stílusú alkalmazások.NET 4.5 (C#, VB) –XAML –(DirectX) C++ –XAML –DirectX HTML/CSS + JS –Filozófia: „Válaszd azt, amihez értesz!” Communication & Data Devices & Printing WinRT APIs Graphics & Media Desktop Apps C C++ Win32 C# VB.NE T HTML JavaScrip t IE 10 Metro style Apps Application Model XAML JavaScript HTML / CSS C++ C# VB Windows Kernel Services DirectX

56 Ismétlés Önálló munka

57 J.Zs.Cs.: Vizuális programozás (c) 2013 Változók Érték típusú Referencia típusú: átmenet a C++-os hivatkozás és mutató között, de kisebb a programozó mozgásszabadsága, mint mutatók esetén Mutató használata erősen korlátozott Azonosító: használhatunk ékezetes betűket

58 J.Zs.Cs.: Vizuális programozás (c) 2013 Típusok osztályozása

59 Value types and reference types in the CTS J.Zs.Cs.: Vizuális programozás (c) us/library/ms173104%28v=vs.100%29.aspx

60 J.Zs.Cs.: Vizuális programozás (c) 2013 Beépített típusok Beépített típusok álnevei Struktúra sbyteSystem.SByte byteSystem.Byte shortSystem.Int16 ushortSystem.UInt16 intSystem.Int32 uintSystem.UInt32 longSystem.Int64 ulongSystem.UInt64 charSystem.Char floatSystem.Single doubleSystem.Double boolSystem.Boolean decimalSystem.Decimal

61 J.Zs.Cs.: Vizuális programozás (c) 2013 A klasszikus induló alkalmazás using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace KonzolAlkalmazás { class Hello class Hello {public static void Main() {Console.WriteLine("Helló világ"); Console.ReadLine();}}}

62 J.Zs.Cs.: Vizuális programozás (c) 2013 XML dokumentáció generálása VS Enterprise Architect

63 J.Zs.Cs.: Vizuális programozás (c) 2013 Konzol IO - Formázott megjelenítés Console.WriteLine( "{0,-5:X}__{1,10:F3}", 100,-555.8); Eredmény: 64 __

64 J.Zs.Cs.: Vizuális programozás (c) 2013 Karakt.Jelentés C A számot pénznemként jeleníti meg a helyi pénznem és szokás használatával. D A számot decimális egészként jeleníti meg. E A számot exponenciális (tudományos) jelöléssel jeleníti meg. F A számot fixpontos értékként jeleníti meg. G A számot vagy fixpontos vagy pedig egészként jeleníti meg attól függően, hogy melyik a rövidebb. N A számot ezres elválasztó vesszőkkel jeleníti meg. X A számot hexadecimális jelöléssel jeleníti meg.

65 J.Zs.Cs.: Vizuális programozás (c) 2013 Lokális változók Lokális változókat csak inicializálás után szabad felhasználni, különben fordítási hiba keletkezik Belső blokkban belül nem hozhatunk létre olyan nevű változót, mint amilyet már létrehoztunk a blokkot tartalmazó valamely blokkban

66 J.Zs.Cs.: Vizuális programozás (c) 2013 Foglalt változónév

67 J.Zs.Cs.: Vizuális programozás (c) 2013Enum enum Napok {Hétfő=1, Kedd, Szerda, Csütörtök, Péntek, Szombat, Vasárnap}; static void Main(string[] args) {int x = (int) Napok.Hétfő; int y = (int) Napok.Péntek; Console.WriteLine("{0,-9} = {1}",Napok.Hétfő,x); Console.WriteLine("{0,-9} = {1}",Napok.Péntek,y); Console.ReadLine(); Console.WriteLine("A hét hányadik napjának nevére kiváncsi? "); string sNapSzam=Console.ReadLine(); int iNapSzam=Int32.Parse(sNapSzam); Console.WriteLine("{0}",(Napok)iNapSzam);Console.ReadLine();}

68 J.Zs.Cs.: Vizuális programozás (c) 2013 Feltételes elágazás if – a feltételben csak logikai típusú adat állhat switch –case rész tartalmazhat változó definíciót –case után string és null is szerepelhet –ha több konstansra akarjuk ugyanazt végrehajtani case 1: case 2: case 3: utasítások; break; –ha két case közé akárcsak egyetlen utasítást is írunk, akkor kötelező a break vagy a goto vagy a throw vagy a return vagy egy végtelen ciklus

69 J.Zs.Cs.: Vizuális programozás (c) 2013 foreach /*Project menü/…Properties/Debug/Command Line Arguments */ public static void Main(string[] args) { foreach (string s in args) Console.WriteLine(s); }

70 J.Zs.Cs.: Vizuális programozás (c) 2013 Metódusok és adattagok Más osztály nyilvános statikus metódusának v. adattagjának meghívása: osztálynév.metódusnév(paraméterek); osztálynév.adattagnév Más osztály objektuma nyilvános metódusának meghívása: objektumnév.metódusnév(paraméterek); objektumnév.adattagnév Taghívás osztályon belülről: this.metódusnév(paraméterek); vagy metódusnév(paraméterek); this.adatagnév vagy adatagnév

71 J.Zs.Cs.: Vizuális programozás (c) 2013 Tömb létrehozása Két lépésben: –referencia változó létrehozása: int [,]x; –definíció: x=new int[5,3]; Egy lépésben (létrehozás kezdőértékadással): int [,]z = new int[2,3] { {1,2,3}, {4,5,6} {4,5,6}}; Tömbre történő hivatkozás átadható paraméterként és lehet visszatérési érték is

72 J.Zs.Cs.: Vizuális programozás (c) 2013 Tömb metódusok int[ ] tmb = {3,8,2,6,9}; Rendezés: System.Array.Sort(tmb); 8 és 2 törlése: System.Array.Clear(tmb,1,2); Másolat: int[ ] masolat=(int [ ])tmb.Clone( ); ha a tömbelemek hivatkozást tartalmaznak, akkor a hivatkozást másolja! Hossz: int hossz=tmb.GetLength(); Első előfordulás (vagy -1) int hely=System.Array.IndexOf(tmb,9);

73 J.Zs.Cs.: Vizuális programozás (c) 2013 Paraméterátadás típusok Érték szerinti hívó  hívott Referencia típusú hívó hívott formális par.l.(ref int a) aktuális par.l.(ref x) x-et hívás előtt inicializálni kell Kimenetihívó  hívott formális par.l. (out int b) aktuális par.l.(out y) y-t hívás előtt nem kell inicializálni

74 Tömbpélda

75 J.Zs.Cs.: Vizuális programozás (c) 2013 Szerelvény - Assembly A fordító által automatikusan generált fájl: DLL vagy EXE Két logikai egységből áll: –típusok és erőforrások (pl. képek) halmaza IL kód –ezek kapcsolatát leíró metaadatok (manifest), és egyéb információk a szerelvényről Egy EXE csak a szerelvényben levő modulokat használhatja Kétfajta szerelvénytípus Legkisebb verziókezelési egység Biztonsági határokat szab

76 J.Zs.Cs.: Vizuális programozás (c) 2013 Hozzáférés szabályozás Alapértelmezés: private public: bárhonnan elérhető private: csak osztályon belül protected: saját és leszármazott osztályból (struktúrában nem szerepelhet) internal: a szerelvény tagjaiból érhető el protected internal: a szerelvény tagjaiból és a tartalmazó osztály leszármazottaiból érhető el

77 J.Zs.Cs.: Vizuális programozás (c) 2013 Internal Nincs friend kapcsolat Bármikor hozzáadhatunk egy szerelvényhez modulokat – az osztály kódjának változtatása nélkül hozzáférést adhatunk egy másik osztály számára Az internal alapértelmezett Struktúra tag nem lehet protected vagy protected internal

78 J.Zs.Cs.: Vizuális programozás (c) 2013 Egy osztályba beépíthető Osztály, struktúra, interfész, felsorolás, metódusreferencia (delegate) Beágyazott osztály kívülről csak public hozzáférés engedélyezése esetén érhető el

79 J.Zs.Cs.: Vizuális programozás (c) 2013 Osztályok Az ősosztályban –törzsnélküli metódusokat deklarálnak – ezek a műveletek Minden osztály –legfeljebb egy közvetlen szülőosztállyal rendelkezhet –de több interfészt valósíthat meg Interfész –nem példányosítható –csak műveleteket tartalmazhat –nincs láthatóság szabályozás, implicit módon public –egy interfésznek lehet egy vagy több szülő interfésze

80 J.Zs.Cs.: Vizuális programozás (c) 2013 Interfész using System; interface IGyakorlat { void Mutat(); } class Próba:IGyakorlat { public void Mutat() public void Mutat() { Console.WriteLine("Mutat() metódus implementációja"); { Console.WriteLine("Mutat() metódus implementációja"); } public static void Main(string[] args) public static void Main(string[] args) { Osztály o = new Osztály(); { Osztály o = new Osztály(); o.Mutat(); o.Mutat(); }}

81 J.Zs.Cs.: Vizuális programozás (c) 2013 Interfész C++ absztrakt osztályhoz hasonló Meghatározza, hogy az őt implementáló osztály milyen tagokat kell tartalmazzon mindenképp Ezeken felül további tagokat is tartalmazhat az osztály Nincs láthatóság szabályozás, implicit módon public interface INév {tagok deklarációja; }

82 J.Zs.Cs.: Vizuális programozás (c) 2013 Interfész Ajánlás: az interfésznév kezdődjön I betűvel Az interfészeknél is van származtatás Egy interfésznek több szülő interfésze lehet Az interfész tagját implementáló osztály lehet virtuális Explicit interfész metódus: az implementáció során a neve elé kiírjuk az interfész nevét is VisszÉrtékTípus Interfésznév.Metódusnév(paraméterlista){…} Interfésznév.Metódusnév(paraméterlista){…}

83 J.Zs.Cs.: Vizuális programozás (c) 2013 Absztrakt osztály és interfész közös jellemzők: –nem példányosítható –nem lehet sealed típusú eltérő tulajdonságok –az AO tartalmazhat implementációt –az AO tartalmazhat nem publikus tagokat –az I csak I-nek lehet leszármazottja –egy osztálynak csak egy osztály jellegű őse lehet, de akárhány I-t implementálhat

84 J.Zs.Cs.: Vizuális programozás (c) 2013 Memória felszabadítás Közvetlen módon nincs (nincs delete) A hivatkozási változónak null értéket adunk A végrehajtás kilép a hivatkozás érvényességi köréből Ha egy objektumra már nincs hivatkozás, a keretrendszer felszabadít – ennek időpontjára nincs garancia

85 J.Zs.Cs.: Vizuális programozás (c) 2013 Objektum megszüntetése szemétgyűjtő mechanizmus 1.lépés: deinicializálás: objektumból  memória (finalize) 2.lépés: felszabadítás: foglalt memória  szabad memória (halom területén)

86 J.Zs.Cs.: Vizuális programozás (c) 2013 object  System.Object A.Net hierarchia minden osztálya ennek leszármazottja Öröklött metódusok: –ToString(): visszaadja a típusnevet –Equals(): megadja, hogy ugyanarra az objektumra vonatkozik-e a hivatkozás –GetType(): RTTI kinyerése

87 J.Zs.Cs.: Vizuális programozás (c) 2013 Kikényszerített típuskonverzió érték típusú változóknál Csak a hagyományos „casting” típus használható long MaxErtek = Int64.MaxValue; Int32 MaxInt = (int)MaxErtek; Console.WriteLine("(int){0}={1}",Max Ertek, MaxInt);

88 J.Zs.Cs.: Vizuális programozás (c) 2013 Típuskonverzió referencia típusú változóknál 1 Egy objektumra vonatkozó referencia mindig átkonvertálható szülő osztály típusú referenciára (explicit vagy implicit módon) Fordítva csak (típus) módon if(objektum is osztálytípus) … Igaz, ha az objektum konvertálható osztálytípusra osztálytípus x=y as osztálytípus; Ha a konverzió lehetséges, akkor végrehajtja, különben null érték kerül x- be. Nem keletkezik kivétel.

89 J.Zs.Cs.: Vizuális programozás (c) 2013 Típuskonverzió referencia típusú változóknál 2 Minden objektum referencia átalakítható egy interfész típusúra, ha az objektum megvalósítja az adott interfészt. Megállapítása is operátorral

90 J.Zs.Cs.: Vizuális programozás (c) 2013 Konstruktor Típusa –Példány konstruktor –Statikus osztály konstruktor Default konstruktor: minden adattagot 0 -ra vagy false-ra inicializál Ha definiálunk egy paraméter nélküli konstruktort, akkor a nem inicializált adattagok megtartják 0 kezdőértéküket

91 J.Zs.Cs.: Vizuális programozás (c) 2013 Statikus osztálykonstruktor Osztály betöltésekor hajtódik végre static kulcsszó Statikus adattagok inicializálása Nem lehet meghívni Láthatósága nem szabályozható Nem vehet át paramétert this kulcsszó nem szerepelhet benne

92 J.Zs.Cs.: Vizuális programozás (c) 2013 Inicializáló lista class Dátum { … public Dátum(int év, int hó, int nap){…} public Dátum(int év, int hó, int nap){…} public Dátum():this(2005,2,22){} …}

93 J.Zs.Cs.: Vizuális programozás (c) 2013 Csak olvasható adattag readonly int x=4; // védett mező- futási idejű konstans // kezdőértékadás lehet konstruktorban is // védett mező- futási idejű konstans // kezdőértékadás lehet konstruktorban is const int i=5; //fordítási idejű konstans csak alaptípusokra //fordítási idejű konstans csak alaptípusokra //definiáláskor kötelező a //kezdőértékadás //definiáláskor kötelező a //kezdőértékadás

94 J.Zs.Cs.: Vizuális programozás (c) 2013 Struktúra konstruktora A fordító mindig létrehoz egy default konstruktort Paraméter nélküli konstruktor nem deklarálható protected konstruktor nem deklarálható Kötelező az összes adattag inicializálása

95 Structpélda

96 J.Zs.Cs.: Vizuális programozás (c) 2013 String osztály Tartalma nem módosítható  StringBuilder Valójában System.String Trim(): egy új sztringet állít elő úgy, hogy a végeiről elhagyja a bevezető és záró szóközöket, tabulátorokat Van indexelője

97 J.Zs.Cs.: Vizuális programozás (c) 2013 BitArray osztály Minden bitje egy logikai hamis vagy igaz értéket tárol 32 bites int-ekben tárolja a logikai értékeket Az index alsó 5 bitje azonosítja be, hogy az adat az int hányadik bitjébe kerül Az index többi bitje határozza meg, hogy hányadik int-be kerüljön az adat

98 Feladat szöveg (16 bit/karakter) tárolása BitArray-ként majd visszaállítás önálló tanulmányozásra

99 J.Zs.Cs.: Vizuális programozás (c) 2013 Becsomagolás Boxing Lehetővé teszi, hogy egy érték típusú adatot objektumként kezeljünk Pl. érték típusú adatot adunk ott át, ahol a formális paraméterlistában objektum szerepel int a = 35; object csomag=a;

100 J.Zs.Cs.: Vizuális programozás (c) 2013 Kicsomagolás Unboxing int a = 35; object csomag=a; int b=(int)csomag;

101 J.Zs.Cs.: Vizuális programozás (c) 2013 Attribútumok Cél: metaadatok osztályhoz rendelése (komponensek szerkesztésénél hasznosak) futtatható alkalmazások viselkedésének megváltoztatása egy objektumra vonatkozó tranzakció információk kinyerése nem menedzselt kód kezelése

102 J.Zs.Cs.: Vizuális programozás (c) 2013 Az attribútumok értékét legtöbbször a programozó által írt kód állítja elő, így egyfajta dokumentálásnak is tekinthetők. Vannak előre definiált attribútumok Mihez rendelhetünk attribútumot: szerelvény (assembly), modul, osztály, struktúra, enum, konstruktor, metódus, tulajdonság, mező, esemény, interfész, paraméter, visszatérési érték, képviselő

103 J.Zs.Cs.: Vizuális programozás (c) 2013 Helye [attribute (helyzeti paraméterek, paraméternév=érték, …)] az elé a szintaktikai elem elé kell helyezni, amire vonatkozik Példák: [DefaultEvent("ShowResult")] public class … [WebMethod] [STAThread] static void Main() …

104 J.Zs.Cs.: Vizuális programozás (c) 2013 a helyzeti paraméterek adják a lényegi információt egy programelemhez több attribútum is tartozhat a szerelvényre vonatkozó attribútumokat a using direktívák után és a kód elé kell írni using System; [assembly:CLSCompliant(true)] class …

105 J.Zs.Cs.: Vizuális programozás (c) 2013 Általános előre definiált attribútumok Attribútum MihezLeírás Conditionalmetódus Ha egy megnevezett szimbólum nincs definiálva, akkor a fordító nem hozza létre a hívást DllImportmetódus A metódus implementációja a megadott dll-ben nem menedzselt kódként szerepel. Hatására futási időben betöltődik a dll

106 J.Zs.Cs.: Vizuális programozás (c) 2013 COM kapcsolatot támogató előre def. attr. Attribute Applicable to Description ComImportClass/Interface Indicates that a class or interface definition was imported from a COM type library. ComRegisterFunctionMethod Specifies the method to be called when a.NET Framework assembly is registered for use from COM. ComUnregisterFuncti on Method Specifies the method to be called when a.NET assembly is unregistered for use from COM.

107 J.Zs.Cs.: Vizuális programozás (c) 2013 COM kapcsolatot támogató előre def. attr. DispId Method, field, property Indicates which dispatch ID is to be used for the method, field or property. In paramete r paramete r Indicates that the data should be marshaled from the caller to the callee. MarshalAs Field, paramete r, return values Specifies how data should be marshaled between COM and the managed environment.

108 J.Zs.Cs.: Vizuális programozás (c) 2013 COM kapcsolatot támogató előre def. attr. ProgIdClass Specifies which prog ID is to be used for the class. Out paramete r paramete r Indicates that data should be marshaled from the callee back to caller. InterfaceTypeInterface Specifies whether a managed interface is IDispatch, IUnknown, or dual when it is exposed to COM.

109 J.Zs.Cs.: Vizuális programozás (c) 2013 Feltételes attribútumok használata lehetővé teszik, hogy egyes metódusokat, pl. változók értékeinek kiíratása csak fejlesztési/hibakeresési időben fordítsunk le feltételek: –a fv. visszatérési értéke legyen void –a fv. nem lehet override –a fv. nem származhat örökölt interfésztől

110 J.Zs.Cs.: Vizuális programozás (c) 2013 Feltételes attr. [conditional("DEBUGGING")] public static void Fv(…) {…}… #define DEBUGGING …Obj.Fv(…); A szimbólum parancssorból is definiálható, és a fv. le lesz fordítva!

111 J.Zs.Cs.: Vizuális programozás (c) 2013 DllImport segítségével nem menedzselt kód is meghívható – amit nem a.Net-hez készítettek (C->DLL) using System.Runtime.InteropServices;... public class MyClass( ) { [DllImport("MyDLL.dll", EntryPoint="MyFunction")] public static extern int MyFunction(string param1);... int result = MyFunction("Hello Unmanaged Code");... } using System.Runtime.InteropServices;... public class MyClass( ) { [DllImport("MyDLL.dll", EntryPoint="MyFunction")] public static extern int MyFunction(string param1);... int result = MyFunction("Hello Unmanaged Code");... }

112 J.Zs.Cs.: Vizuális programozás (c) 2013 Transaction attr COM+ : olyan objektumok fejlesztése, amelyek elosztott tranzakciókban vehetnek részt – több adatbázist, gépet, komponenst fognak át using System.EnterpriseServices;... [Transaction(TransactionOption.Required)] public class MyTransactionalComponent {... } using System.EnterpriseServices;... [Transaction(TransactionOption.Required)] public class MyTransactionalComponent {... }

113 J.Zs.Cs.: Vizuális programozás (c) 2013 Attribútumok definiálása meg kell adni, hogy mire vonatkozóan akarunk attribútumot létrehozni (érvényességi kör) [AttributeUsage(AttributeTargets.Method)] public class MyAttribute: System.Attribute {... } [AttributeUsage(AttributeTargets.Method)] public class MyAttribute: System.Attribute {... } [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)] public class MyAttribute: System.Attribute {... } [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)] public class MyAttribute: System.Attribute {... }

114 J.Zs.Cs.: Vizuális programozás (c) 2013 Mire lehet Class,Constructor,Delegate,Enum,Event,Field,Inte rface,Method,Module,Parameter,Property,ReturnV alue,Struct,Assembly,All Konvenció: az attribútumot definiáló osztály nevének vége legyen Attribute public class DeveloperInfoAttribute: System.Attribute {... public DeveloperInfoAttribute(string developer) public DeveloperInfoAttribute(string developer) {... } {... } public string Date public string Date { get {... } { get {... } set {... } set {... } }}

115 J.Zs.Cs.: Vizuális programozás (c) 2013 Szabályok kell legyen konstruktora (csak egy lehet), ami beállítja a kötelező információt – a helyzeti paraméter(ek) adják át opcionális paraméterekhez használjunk névvel ellátott paramétereket az attribútum osztály használhat tulajdonságokat adatok beállítására vagy lekérdezésére

116 J.Zs.Cs.: Vizuális programozás (c) 2013 [XAttribute("Géza", Dátum=" ")] public class OsztNév {… }

117 J.Zs.Cs.: Vizuális programozás (c) 2013 Saját definiálású attribútum feldolgozása Ha a fordító egy programelemre vonatkozó attribútumot talál, akkor 1.megkeresi az attribútum osztályt 2.ellenőrzi az érvényességi kört 3.megkeresi az attr konstruktorát 4.létrehoz egy objektumpéldányt 5.névvel ellátott paramétereket keres 6.a mezőket vagy tulajdonságokat beállítja a névvel ellátott paraméter értéke 7.lementi az attr osztály aktuális állapotát

118 J.Zs.Cs.: Vizuális programozás (c) 2013 Saját definiálású attribútum feldolgozása egy programelem több attribútummal is rendelkezhet, ezeket külön kell definiálni egy attribútum többször is szerepelhet egy programelemhez kapcsolódóan, ilyenkor az érvényességi körnél meg kell adni az AllowMultiple=true-t

119 J.Zs.Cs.: Vizuális programozás (c) 2013 [Transaction(TransactionOption.Required)][DefaultProperty("Balance")] public class FinancialComponent: System.Attribute { public long Balance public long Balance { }}

120 J.Zs.Cs.: Vizuális programozás (c) 2013 [AttributeUsage(AttributeTargets.Class, AllowMultiple=true)] public class DeveloperInfoAttribute: System.Attribute {......}

121 J.Zs.Cs.: Vizuális programozás (c) 2013 Metaadatok felhasználása a lekérdezési mechanizmus neve: Reflection using System.Reflection; … MemberInfo[] miTomb; typeof(MyClass).GetMembers( );...

122 J.Zs.Cs.: Vizuális programozás (c) 2013 Attribútum információk lekérdezése... object [ ] attrs = typeInfo.GetCustomAttributes(false); foreach(Attribute atr in attrs) { if (atr is DeveloperInfoAttribute) { if (atr is DeveloperInfoAttribute) { DeveloperInfoAttribute dia = (DeveloperInfoAttribute)atr; DeveloperInfoAttribute dia = (DeveloperInfoAttribute)atr; Console.WriteLine("{0} {1}", dia.Developer, dia.Date); Console.WriteLine("{0} {1}", dia.Developer, dia.Date); }}...

123 J.Zs.Cs.: Vizuális programozás (c) 2013 Öröklődés Az öröklődés mechanizmusa a C++-beli publicnak felel meg Ha egy osztályt sealed jelzővel látnak el, akkor nem lehet szülőosztály (nem származtathatunk belőle) Struktúránál nincs öröklődés Ha egy metódus paraméterként átvesz egy hivatkozást egy szülő osztályra, akkor annak csak a public tagjaihoz fér hozzá Szülő osztály konstruktorának meghívása: base(paraméterlista)

124 J.Zs.Cs.: Vizuális programozás (c) 2013 Sealed módosító beállítása

125 J.Zs.Cs.: Vizuális programozás (c) 2013 Szülő osztály konstruktorának meghívása class Szülő { protected Szülő(string paraméter) {... } protected Szülő(string paraméter) {... }......} class Gyerek: Szülő { public Gyerek(string paraméter) : base(paraméter) { } public Gyerek(string paraméter) : base(paraméter) { }......}

126 J.Zs.Cs.: Vizuális programozás (c) 2013 Öröklődés A szülő osztály egy tagjára a base.tagnév alakban hivatkozhatunk (pl. ha a leszármazott osztály felüldefiniálta) Virtuális metódus: public virtual (nem lehet private vagy static) –ősosztályban: virtual –leszármazottban: override (nem lehet private vagy virtual)

127 J.Zs.Cs.: Vizuális programozás (c) 2013 Öröklődés példa

128 J.Zs.Cs.: Vizuális programozás (c) 2013 Operátorok átdefiniálása Az operátorokat a fordító metódushívásokká alakítja Nem lehet: értékadó operátor Lehet: relációs, logikai (nem közvetlenül), konverziós, aritmetikai, bitléptető

129 J.Zs.Cs.: Vizuális programozás (c) 2013 Relációs operátorok Mindig párosával kell átdefiniálni (, =, == és !=) Az Equals és a GetHashCode metódusokat is át kell definiálni az egyenlőségvizsgálatnál GetHashCode: eredetileg arra szolgál, hogy egy objektum példányt beazonosítsunk egy hash táblában tárolt érték alapján. Az Equals által azonosnak minősített két objektum azonos hash kóddal kell rendelkezzen, ezért kell ezt a metódust is átírni.

130 J.Zs.Cs.: Vizuális programozás (c) 2013 Példa az operátor átdefiniálásra DatumKezelo

131 J.Zs.Cs.: Vizuális programozás (c) 2013 Logikai operátorok && és || nem definiálható át közvetlenül, de a kiértékelésüknél használt &,|, true, false viszont igen Ha x és y T típusú, akkor x&&y esetén T.false(x)?x:T.&(x,y) X||y esetén T.true(x)?x:T.|(x,y) Példaalkalmazás

132 J.Zs.Cs.: Vizuális programozás (c) 2013 Példa: Logikai operátorok átdefiniálása

133 J.Zs.Cs.: Vizuális programozás (c) 2013 Konveziós operátorok Explicit, ha kivételt idézhet elő vagy adatvesztéssel járhat Explicit konverzió csak a konverziós operátorral idézhető elő (casting) Implicit, ha biztosan jól és adatvesztés nélkül működik

134 Példa Dátumkonverzió

135 J.Zs.Cs.: Vizuális programozás (c) 2013 public static explicit operator Datum(int napok) {Datum d=new Datum(0,0,0); if(napok<=0) throw new InvalidCastException ("A napok száma negatív értéknek lett megadva."); d.Ev=napok/365;d.Nap=napok-d.Ev*365;d.Ho=0;while(d.Nap>0) {d.Ho++; d.Nap-=Honapok[d.Ho-1];}d.Nap+=Honapok[d.Ho-1]; return d; } Datum d4=(Datum)731878;

136 Kivételek és kezelésük

137 J.Zs.Cs.: Vizuális programozás (c) 2013 Hiba-leállás Ctrl+F5 Hibás adat Nem kezelt kivétel

138 J.Zs.Cs.: Vizuális programozás (c) 2013 Hiba-leállás F5 Hibás Adat Nem kezelt kivétel

139 J.Zs.Cs.: Vizuális programozás (c) 2013 Cél: hibakezelés új adatok bekérésével

140 J.Zs.Cs.: Vizuális programozás (c) 2013 Kivételosztályok

141 Milyen kivételek következhetnek be? SúgóGyorstipp

142 J.Zs.Cs.: Vizuális programozás (c) 2013 Felkészülés többfajta kivétel kezelésére Minden hibatípushoz külön catch blokk Közös catch blokk általánosabb kivételosztállyal Általános catch blokk

143 J.Zs.Cs.: Vizuális programozás (c) 2013 Kivétel továbbadása - A finally blokk használata

144 J.Zs.Cs.: Vizuális programozás (c) 2013 Kivételek előidézése if (perc = 60) {throw new InvalidTimeException(perc + " érvénytelen percérték"); " érvénytelen percérték"); // !! ide már nem jut el a vezérlés !! // !! ide már nem jut el a vezérlés !!}

145 J.Zs.Cs.: Vizuális programozás (c) 2013 Aritmetikai túlcsordulás alapértelmezés szerint nincs ellenőrizve programban utasításra checked { int szam = int.MaxValue; Console.WriteLine(++szam); // OverflowException Console.WriteLine(++szam); // OverflowException}unchecked { int szam = int.MaxValue; Console.WriteLine(++szam); // Console.WriteLine(++szam); // } programban kifejezésre: (checked(++szam))

146 J.Zs.Cs.: Vizuális programozás (c) 2013 Példa Egyszerű kivételkezelés Faktoriálisszámítás kivételkezeléssel

147 J.Zs.Cs.: Vizuális programozás (c) 2013 Visszatekintés (Reflection) Egy objektum típusáról, tagjairól nyerhetünk információt System.Reflection névtér System.Type osztály: típusazonosság vizsgálata typeof operátor: csak a fordítási időben már létező osztályokon működik

148 J.Zs.Cs.: Vizuális programozás (c) 2013 typeof using System; using System.Reflection; … Type típus=typeof(int); MethodInfo[ ] metódusok=típus.GetMethods(); foreach (MethodInfo mi in metódusok) Console.WriteLine(mi);Console.ReadLine();


Letölteni ppt "Ismétlés Néhány fontosabb nyelvi elem. Tulajdonságok."

Hasonló előadás


Google Hirdetések