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

V 1.0 Szabó Zsolt, Óbudai Egyetem, 2011 1 Programozási Paradigmák és Technikák Programozási eszközök Interfészek Generikus.

Hasonló előadás


Az előadások a következő témára: "V 1.0 Szabó Zsolt, Óbudai Egyetem, 2011 1 Programozási Paradigmák és Technikák Programozási eszközök Interfészek Generikus."— Előadás másolata:

1 V 1.0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu 1 Programozási Paradigmák és Technikák Programozási eszközök Interfészek Generikus osztályok Operator overloading Adatstruktúrák Láncolt Lista Bináris keresőfa Gráfok Dijkstra algoritmus Kruskal algoritmus

2 V 1.0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu 2 Programozási Paradigmák és Technikák Programozási eszközök Interfészek Generikus osztályok Operator overloading Adatstruktúrák Láncolt Lista Bináris keresőfa Gráfok Dijkstra algoritmus Kruskal algoritmus

3 V 1.0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu 3 Metódusok "előírására", kötelezővé tételére használható Az osztályban kötelezően kell lennie egy publikus Eldönt() eljárásnak (ha nincs: a fordító reklamál) Hasonló, de teljesen másra használt: absztrakt osztály Kifejezés: "az X osztály implementálja az Y interfészt" Interfészek

4 V 1.0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu 4 Egy interfészt implementáló osztály egy példányára akár interfész típusú változó is mutathat: IEldönthető valtozo=new SajátOsztály(); Egy interfész-metódus szokványosan elérhető az osztálypéldányon keresztül: SajátOsztály valtozo=new SajátOsztály(); valtozo.Eldönt(); … Vagy az interfészen keresztül: (valtozo as IEldönthető).Eldönt(); Ez utóbbira akkor van szükség, ha explicit megvalósítású az interfész az osztályban, vagy a változó típusából nem egyértelmű az interfész implementálása Interfészek - lehetőségek

5 V 1.0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu 5 Explicit implementáció Azonos eljárást előíró interfészek esetén lehet szükséges

6 V 1.0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu 6 Explicit Implementáció

7 V 1.0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu 7 Explicit implementáció használata A következő órán fogunk saját interfészt létrehozni, ezen az órán csak meglévő interfészeket használunk

8 V 1.0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu 8 Interfészek használata Tipikusan: funkcionalitás előírásánál, avagy előírásnak megfelelésnél (pl. VEP: ha az INotifyPropertyChanged interfészt implementálom egy olyan osztálynál, aminek a példányait ListBox vezérlőben helyezem el, akkor ez előír egy eseményt, amire a ListBox feliratkozik – ezen az eseményen keresztül tudja a ListBox, ha frissítenie kell) "A változó típusából nem egyértelmű az interfész implementálása"  Ugyanaz, mint amikor OOP-ben ős típusú volt a tömb, és nem tudtuk, hogy az egyes tömbelemek milyen típusúak Van olyan eset, amikor a gyűjteményből/tömbből csak néhány elem implementál egy bizonyos interfészt, az interfész implementálását ugyanúgy az IS kulcsszóval lehet ellenőrizni

9 V 1.0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu 9 Interfészek használata

10 V 1.0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu 10 Array.Sort(tömb)  tömb rendezése. int[] esetén tökéletesen működik Készítsünk egy osztályt, amelynek segítségével hallgatókat tudunk tárolni: név, neptun kód, teljesített kreditek Töltsünk fel egy 10 elemű tömböt hallgatókkal. Hogyan tudjuk ezt a tömböt a fenti módon névsorba vagy teljesített kreditek szerinti sorba rendezni?  IComparable  IComparable.CompareTo(object) Interfészek használata

11 V 1.0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu 11 Programozási Paradigmák és Technikák Programozási eszközök Interfészek Generikus osztályok (© Erdélyi Krisztina) Operator overloading Adatstruktúrák Láncolt Lista Bináris keresőfa Gráfok Dijkstra algoritmus Kruskal algoritmus

12 V 1.0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu 12 Generikus Osztályok A generic fogalma Generikus osztályok Generikus metódusok Megszorítások Statikus tagok Öröklés A generic-ek működése.NET-ben

13 V 1.0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu 13 Bevezetés – feladat Cél: halmaz típus létrehozása, egy elemet egyszer tartalmazhat, a lehető legáltalánosabb módon Milyen elemekből álljon a halmaz? –Személy – akkor a kutya-klubhoz át kell írni –A személy és a kutya őse – ez biztos, hogy elég általános? –Object ez mindennek az őse - ez lehet megoldás  ArrayList,.NET1, csak object-et tárol, állandó castolás –A típust adjuk meg paraméterként, így elég a deklarációban megadni a konkrét típust – ez is megoldás Vizsgáljuk meg ezt közelebbről!

14 V 1.0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu 14 A generic fogalma.NET-ben Paraméterezett típus vagy metódus Minden egyes paraméter egy még meg nem határozott típus helye Más néven sablon vagy template Az osztály tervezésekor csak T néven hivatkozok a típusra, csak az osztály példányosításakor definiálom, hogy ez a T pontosan mi

15 V 1.0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu 15 Paraméterezett típusok A paraméter a típus fejrészében helyezkedik el class MyGenericClass { } Deklarációnál és példányosításkor az aktuális típus kerül a paraméter helyére MyGenericClass mgcINT = new MyGenericClass (); A generic-ek tipikusan gyűjtemények létrehozásához valók, mivel a gyűjtemények több típussal is használhatók

16 V 1.0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu 16 Saját generikus osztály létrehozása

17 V 1.0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu 17 Generikus osztály használata

18 V 1.0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu 18 Generikus gyűjtemények ArrayList  object típust tárol, állandó castolás, elavult List : Add(), Insert(), Remove(), RemoveAt(), Reverse(), [], Clear(), Contains(), Count Queue : Enqueue(), Dequeue(), Peek(), Clear(), Contains(), Count Stack : Push(), Pop(), Peek(), Clear(), Contains(), Count Dictionary : Add(), Remove(), TryGetValue(), Keys, Values, Clear(), ContainsKey(), ContainsValue(), Count

19 V 1.0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu 19 Paraméterezett típus inicializálása Nem tudható, hogy érték vagy referencia típusú-e a paraméter Megoldás: default expression –Referenciánál null-t ad vissza –Érték típusnál bitenkénti nullát this.elem = default(T);

20 V 1.0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu 20 Megszorítások Lefordulnak a következő kódok? Ha nem, akkor mi a megoldás? Annyit feltételezhetünk, hogy a T típus a System.Object-ből származik Ezért ennek megfelelően viselkedik

21 V 1.0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu 21 class MyClass2 where T : IEnumerable { public void Iterate(T data) { foreach (object item in data) { Console.WriteLine(item); } Interfész megszorítás class MyClass2 { public void Iterate(T data) { foreach (object item in data) { Console.WriteLine(item); } Nem biztos, hogy T felsorolható! (A foreach ciklus akkor működik saját típuson, ha a saját típus megvalósítja a IEnumerable interfészt, ld. később) OK

22 V 1.0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu 22 Konstruktor megszorítás class MyClass { T obj = new T(); } class MyClass where T:new() { T obj = new T(); } Nem biztos, hogy T-nek van alapértelmezett konstruktora! OK

23 V 1.0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu 23 Művelet megszorítás??? class Arithmetic { public T Cubed(T number){ return number * number * number; } class Arithmetic where T : System.Int32{ public T Cubed(T number){ return number * number * number; } Nem biztos, hogy T-n értelmezett a szorzás! Érték és primitív típusok nem lehetnek megszorítások! Súlyos korlátja a generic-ek használatának, hogy standard operátorok az érték típusokkal nem használhatók.

24 V 1.0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu 24 A Generic korlátja class Program2 { public T Min (T a, T b) where T : IComparable { if (a<b) return a; else return b; } class Program { public T Min (T a, T b) where T : IComparable { if (a.CompareTo(b)<0) return a; else return b; }… } A standard operátorok nem használhatók.

25 V 1.0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu 25 Megszorítások A megszorítások a típus paraméterektől elvárt viselkedést írják le A where kulcsszóval vezetjük be Típusnál és metódusnál is használhatók Fajtáik: –Leszármazott (where T : Személy) –Interfész (where T: IEnumerable ) –Érték típus (where T: struct) –Referencia típus (where T: class) –Konstruktor (where T: new()) Az alábbi típusok nem lehetnek megszorításban: –Lezárt osztályok –Primitív típusok –System.Array –System.Delegate –System.Enum –System.ValueType

26 V 1.0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu 26 Generikus metódus Tartozhat generikus vagy nem generikus típushoz Azért, mert az osztály generikus, a metódus még nem A metódus generikus, ha saját típusparamétere(i) van(nak) A típusparaméter megjelenhet visszatérési értékként vagy a paraméterlistában

27 V 1.0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu 27 Generikus metódusok meghívása A metódus meghívásakor a paraméterek típusa adja meg a típusparaméter aktuális értékét: int i=Min(2, 3); //egészek float f=Min(2.0, 3.0); //valósak Ellentmondás esetén a nem-generikus eljárás hívódik: mi van, ha T=int?  a nem-generikus változat hívódik meg Ha két generikus metódus van különböző generikus paraméterrel pl. Method(T arg), Method(U arg), és T és U konkrétan ugyanaz, akkor a metódus meghívásánál jelez hibát.

28 V 1.0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu 28 Statikus tagok A statikus tagok eléréséhez be kell helyettesíteni egy konkrét típust a paraméterbe MyGenericClass.Count(); Különböző behelyettesített típusokhoz különböző statikus tagok tartoznak A statikus konstruktor implicit meghívódik, és a behelyettesített típusnak megfelelően inicializálja a statikus mezőket

29 V 1.0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu 29 Példányok számolása class MyGenericClass { private static int counter = 0; public MyGenericClass() { counter++; } public static void Count() { Console.WriteLine(counter); }

30 V 1.0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu 30 Generikus osztályok az öröklésben Generikus osztály lehet őse generikus és nem generikus osztálynak Generikus osztály származhat generikus vagy nem generikus osztályból De mindkét állítás csak bizonyos esetekben igaz! Gondoljunk arra, hogy az utód példányosításakor a típusparaméterek értékét mindenképpen meg kell határozni

31 V 1.0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu 31 Generikus osztályok az öröklésben Melyik eset lehetséges?

32 V 1.0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu 32 Generikus osztályok az öröklésben és a.NET-ben A típusra vonatkozó ős osztálybeli megszorításokat az utódosztályban meg kell ismételni Az utódosztály tartalmazhat további megszorításokat Nem nyelvspecifikus, minden felügyelt nyelvben elérhető A köztes kódra való fordítás során metaadatok és a generic-ekre vonatkozó MSIL kód áll elő A JIT fordítás során történik meg a konkrét típusok behelyettesítése Lehetőség van több típus használatára: class valami { }

33 V 1.0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu 33 A generic-ek működése.NET-ben A fenti kódhoz három osztály jön létre. A két MyGenericClass osztozik egy osztályon. A MyGenericClass külön osztály. A MyGenericClass és a MyGenericClass osztozik egy osztályon.

34 V 1.0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu 34 Feladat: halmaz Hozzunk létre egy generikus halmaz osztályt, amelyben List segítségével tároljuk az elemeket Kell: konstruktor, copy konstruktor, elem hozzáadása Cél: foreach ciklus működjön:

35 V 1.0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu 35 IEnumerable / IEnumerator A foreach ciklus akkor működik saját típuson, ha a saját típus megvalósítja a IEnumerable interfészt Ez az interfész előírja a GetEnumerator() eljárást, ami visszaad egy olyan objektumpéldányt, ami megvalósítja az IEnumerator interfészt Az IEnumerator előírja a következő műveleteket: Aktuális elem olvasása (Current), következő elemre mozgás (MoveNext()), visszaállás az első előtti elemre (Reset())  lista bejárása Mindegyik interfész előírja a nemgenerikus (object) változatot is Saját enumeratort a következő órán fogunk implementálni, addig meglévő enumeratort használunk

36 V 1.0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu 36 Programozási Paradigmák és Technikák Programozási eszközök Interfészek Generikus osztályok Operator overloading Adatstruktúrák Láncolt Lista Bináris keresőfa Gráfok Dijkstra algoritmus Kruskal algoritmus

37 V 1.0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu 37 Operator Overloading halmaz ha = new halmaz (); halmaz hb = new halmaz (); ha.hozzaad(42); hb.hozzaad(15); ha.hozzaad(23); halmaz hc = ha + hb;  unió  public static halmaz operator +(halmaz h1, halmaz h2) { } halmaz hc = ha - hb;  különbség halmaz hc = ha * hb;  metszet halmaz hc = ha + 5;  elem hozzáadása halmaz hc = ha - 5;  elem törlése A kimenet mindig ÚJ objektumpéldány Új operátort nem lehet feltalálni Az azonos/hasonló operátorok lehetőleg hivatkozzanak egymásra

38 V 1.0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu 38 Operator Overloading Implicit konverzió, T  halmaz –halmaz ha = 5; halmaz hb="Hello"; –public static implicit operator halmaz (T elso) { } Explicit konverzió, halmaz  string –string valami = (string)ha; –public static explicit operator string(halmaz be) { } Ugyanarra a típusra nem lehet mindkettő konverziót definiálni! A kimeneti típus vagy a bemeneti típus kötelezően az operátort tartalmazó osztály! if (ha==hb) / if (ha!=hb) / if (ha.Equals(hb)) Equals: példányok tartalmi egyezés-vizsgálata. Sok mező/beágyazott osztály esetén inkább javasolt: GetHashCode()

39 V 1.0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu 39 Tesztelés

40 V 1.0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu 40 Programozási Paradigmák és Technikák Programozási eszközök Interfészek Generikus osztályok Operator overloading Adatstruktúrák Láncolt Lista Bináris keresőfa Gráfok Dijkstra algoritmus Kruskal algoritmus

41 V 1.0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu 41 Láncolt Lista Egyszeresen láncolt, ciklikus, kétszeresen láncolt listák (ld. Ea.) Strázsa-elemes, rendezett láncolt listák (ld. Ea.) Órai feladat: telefonkönyv-bejegyzések (név, cím, telefonszám) egyirányú, nem rendezett láncolt listába fejtése ZH: egyéb láncolás is lehetséges

42 V 1.0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu 42 A fejlesztés menete 1.Generikus osztályként megtervezzük a ListaElem osztályt, amely egy T típusú referenciát tárol, valamint egy referenciát a következő listaelemre 2.Generikus osztályként megtervezzük a Lista osztályt, amely tárol egy referenciát az első listaelemre, emellett itt implementáljuk az eljárásokat is: a)public void Beszúr(T elem) b)public T Keres(T mitkeres, out bool talalt) c)public bool Töröl(T elem) d)public bool Töröl(int index) e)Cél: a lista osztályt be lehessen járni foreach ciklussal 3.A foreach ciklus működése miatt tervezünk egy saját felsorolót 4.Megtervezzük a bejegyzés osztályt, amit ténylegesen tárolni akarunk 5.Tesztprogram írása

43 V 1.0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu 43 Lista + ListaEnumerator ListaElem Elso; + konstruktor? public void Beszúr(T elem)  PPT előadás public T Keres(T mitkeres, out bool talalt)  PPT előadás, p.Elem.Equals(mitkeres) public bool Töröl(T elem)  PPT előadás, ugyanúgy Equals() public bool Töröl(int index)  index szerinti törlés Cél: a lista osztályt be lehessen járni foreach ciklussal –  saját felsoroló készítése: konstruktor (*), aktuális elem kiolvasása, következőre való mozgás, első előttire való visszaállás (*) ListaElem T típusú adatot tárol + egy referenciát a következő elemre Tulajdonságok, konstruktor, ToString()

44 V 1.0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu 44 Telefonkönyv bejegyzés Név + Cím + Telefonszám Konstruktor + ToString() Speciális Equals() : rész-egyenlőség visszaadott értéke is true Tesztprogram Lista telefonszámok = new Lista (); Bejegyzes keresett, talalt; bool van;

45 V 1.0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu 45 Tesztprogram

46 V 1.0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu 46 Tesztprogram

47 V 1.0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu 47 Programozási Paradigmák és Technikák Programozási eszközök Interfészek Generikus osztályok Operator overloading Adatstruktúrák Láncolt Lista Bináris keresőfa Gráfok Dijkstra algoritmus Kruskal algoritmus

48 V 1.0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu 48 Bináris keresőfa

49 V 1.0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu 49 A fejlesztés menete 1.Generikus osztályként megtervezzük a csucs osztályt, amely egy T típusú referenciát tárol, valamint egy referenciát a jobb és a bal oldali gyermek-elemre 2.Generikus osztályként megtervezzük a fa osztályt, amely tárol egy referenciát a gyökérelemre, valamint azt, hogy milyen bejárást akarunk használni (szélességi, mélységi, inorder, preorder, postorder), emellett itt implementáljuk az eljárásokat is: a)public bool bennevan(T elem) b)public void beszur(T ujelem) c)public bool torol(T x) d)Cél: a fát be lehessen járni foreach ciklussal 3.A foreach ciklus működéséhez az éppen kiválasztott bejárást hívjuk meg, és a produkált lista felsorolóját ( List >.GetEnumerator() ) használjuk fel 4.Tesztprogram írása, amiben a fa számokat tárol

50 V 1.0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu 50 Fejlesztési sajátosságok A csúcs osztályban a gyermek-elemekhez ne csináljuk tulajdonságot, maradjanak publikus adattagok – ez nem szép megoldás, de ha a gyermekcsúcsokat referenciaként akarom továbbadni, akkor erre szükség van Az előadáson bemutatott eljárások egyik paramétere az aktuális csúcs, ami kiindulási állapotban a gyökér. Ugyanakkor a publikus eljárásban ez nem szerepel, pl. public void beszur(T ujelem) Megoldás: a publikus eljárás nem-publikus eljárásra hivatkozik, pl. priv_beszur(ref FRoot, ujelem) A "referencia referenciája" probléma: miért kell a ref csucs némelyik paraméternél? Szélességi bejárás sor, mélységi bejárás verem adatszerkezettel xxOrder bejárás rekurzióval Fa magsságának számolása fa  int explicit konverziónál

51 V 1.0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu 51 Tesztprogram I.

52 V 1.0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu 52 Tesztprogram II.

53 V 1.0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu 53 Tesztprogram III.

54

55

56 V 1.0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu 56 Képek forrásai http://people.ksp.sk/~kuko/bak/ (megjegyzés: a fenti oldal nagyon jó, de kicsit más a BST, mint az előadáson ismertetett: törlés-C esetnél (amikor mindkét gyermekeleme létezik a törlendő elemnek) nem a bal oldali részfa legjobboldalibb elemét, hanem a jobb oldali részfa legbaloldalibb elemét használja) http://en.wikipedia.org/wiki/Linked_List

57 V 1.0 Szabó Zsolt, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu 57 Képek forrásai


Letölteni ppt "V 1.0 Szabó Zsolt, Óbudai Egyetem, 2011 1 Programozási Paradigmák és Technikák Programozási eszközök Interfészek Generikus."

Hasonló előadás


Google Hirdetések