C# osztálydeníció Krizsán Zoltán 1 Általános Informatikai Tanszék Miskolci Egyetem.net C# technológiák tananyag objektum orientált programozás tananyag
Tartalom 1 Bevezetés 2 Osztály létrehozása, deníció Adatszer elemek Függvényszer tagok Osztály hatáskör Hozzáférési kategória this pszeudó változó Parciális (részleges) osztály Elemek használata 3 Létez osztály használata Példányosítás Hivatkozás
Osztály - egység Önálló hatáskörrel rendelkez, adattípus melyben logikailag összetartozó elemek találhatóak: adatszer függvény szer
Osztály deklaráció attributes opt class-modiers opt partial opt class identier type-parameter-list opt class-base opt type-parameter-constraints-clauses opt class-body ; opt 1 class Pelda 2 { 3 }
Osztály módosítók Egy módosító csak egyszer szerepelhet! new public protected internal private abstract sealed static
Osztály elemei
Osztály elemei class-member-declaration: constant-declaration: állandó az osztályon belül eld-declaration: változó az osztályon belül method-declaration: metódus, függvény property-declaration: tulajdonság, kívülr l változónak látszik, de metódusok szolgálják ki. indexer-declaration: [] speciális tulajdonság constructor-declaration: kontruktor destructor-declaration: destruktor static-constructor-declaration: osztály szint konstruktor type-declaration: típus event-declaration (nem tananyag) operator-declaration ( nem tananyag)
Osztály elemeinek elnevezése Minden elemének azonosítója van. Adatszer elemek azonosítóinak különböznie kell az elemekt l: konstans, adattag, tulajdonság, esemény, típus. Metódus nevének különböznie kell a nem metódusok neveit l. Vannak foglalt nevek, amiket nem használhatunk automatikusan generált elemeknek: get_item, set_item, add_e, remove_e, get_xxx, set_xxx Finalize JAVA-sok vigyázat (ott az ilyen nevek divatosak)!
Outline 1 Bevezetés 2 Osztály létrehozása, deníció Adatszer elemek Függvényszer tagok Osztály hatáskör Hozzáférési kategória this pszeudó változó Parciális (részleges) osztály Elemek használata 3 Létez osztály használata Példányosítás Hivatkozás
Adattag (eld) Deníciója: [módosítók] típusnév azonosítólista A típusnév valamelyik egyszer típus, tömb típus, vagy osztálynév lehet. A névlista elemeit vesz vel választjuk el, formájuk: azonosító[=inicializáló kifejezés] 1 class Pelda 2 { 3 private int _filed1; 4 private int _filed2 = 7; 5 }
Adattag (eld) II Az inicializáló kifejezésben csak el tte már deklarált adattagok használhatók. Az inicializáló kifejezés minden példányosítás esetén kiértékel dik. Nem inicializált adattag az alábbi (típustól függ ) default értékkel inicializálódik: boolean: false char: '\u0000' minden egész típus: 0 minden lebeg pontos típus: 0.0 osztály típus: null
Csak olvasható adattag readonly kulcsszó használata, Futási id ben állítható az értéke, de csak egyszer! Értékét akár fv. hívás visszatérési értéke is szolgáltathatja! értéke futásidej is lehet (konstans csak fordítási idej ) beállítása lehet deklaráció során vagy konstruktorba (kés bb megismerjük) vagy statikus konstruktorban (kés bb megismerjük) out vagy ref paraméter nem lehet (kés bb megismerjük)
Konstans Értéke fordítási id ben állítódik be, futási id ben értéke nem változtatható. Csak konstans értékét veheti fel. Alapértelmezett tárolási osztálya static. Nem kell példányosítani az osztályt ahhoz, hogy használjuk MSIL kódban lcd utasítás (load constant) tölti fel a stack-re.
Tulajdonság Kívülr l adattagnak látszik belülr l metódusok. Lehet csak írható, lehet csak olvasható. getter-ben kell legyen egy megfelel return setter-ben létezik egy csak olvasható value változó Nem lehet fv. bármilyen paramétere! Absztrakt osztály segítségével kikényszeríthet a léte! lehet automatikus: public int X { get; set; } public int X { get; private set; }
Tulajdonság váz [attributes] [modifers] <type> <property-name> { [ set { <accessor-body> } ] [ get { <accessor-body > } ] }
Tulajdonság példakód 1 public class Button: Control 2 { 3 private string caption; 4 public string Caption { 5 get { 6 return caption; 7 } 8 set { 9 if (caption!= value) { 10 caption = value; 11 Repaint(); 12 } 13 } 14 } 15 public override void Paint(Graphics g, Rectangle r) { 16 // Painting code goes here 17 } 18 }
Outline 1 Bevezetés 2 Osztály létrehozása, deníció Adatszer elemek Függvényszer tagok Osztály hatáskör Hozzáférési kategória this pszeudó változó Parciális (részleges) osztály Elemek használata 3 Létez osztály használata Példányosítás Hivatkozás
Metódus Hasonló a C függvény deníciójához. Formája: [módosítók]típus név(paraméterlista)[... ] A módosítókkal és a [... ] helyén álló elemmel kés bb foglalkozunk. A többi ugyanaz, mint a C-ben, kivéve a tömb paramétereket (hiszen nincs pointer!)
Delegátum - esemény Függvényszer elemek függvényeket állíthatunk rá, küls metódusokra is "mutathat, használata szempontjából függvény hívásnak látszik, er s típusosság: kiköveteli a megfelel paramétereket és megfelel visszatérési értéket. kódban egy metódus hívás látszik, de hatására lehet, hogy több metódus hívódik meg.
Túlterhelt operátor a @ b vagy @a vagy a@ (pl.: a + b, a++, ++a) konverziós operátorok (inplicit, explicit) A C# nyelv lehet séget nyújt arra, hogy a programozó által deniált típusokra az operátorok átértelmezhet k legyenek. A polimorzmus implementációja! Egy operátorjel operandusainak típusa határozza meg az operátorjel jelentését. A jelentést függvény denícióval (tagfüggvénnyel) írhatjuk le.
Tulajdonság Bár kívülr l adattagnak látszik, de a megvalósítása függvény szer. Kiszolgáló elemek speciális függvényszer elemek speciális nevük van (set get) nincs paraméter listája nincs visszatérési érték típusa [attributes] [modifers] <type> <property-name> { [ set { <accessor-body> } ] [ get { <accessor-body > } ] }
Indexer A [] operátor jelentésének átdeniálása. Osztályunk példányait tömbként használhatjuk. A tulajdonság és az operátor felüldeniálás keveréke. A paraméter lehet int vagy string. public Alapelem this[int index] { get { return (Alapelem)arElemek[index]; } set { arelemek.insert(index, value); } }
Outline 1 Bevezetés 2 Osztály létrehozása, deníció Adatszer elemek Függvényszer tagok Osztály hatáskör Hozzáférési kategória this pszeudó változó Parciális (részleges) osztály Elemek használata 3 Létez osztály használata Példányosítás Hivatkozás
Osztály hatáskör Az egységbe zárás alapelvének implementálása: minden osztály saját hatáskörrel rendelkezik. Egy osztály minden eleme tehát lokális az osztályra nézve. Következmények: Különböz osztályokban használhatjuk ugyanazt az azonosítót eltér értelemben! Az osztályon belül az elemek egymásra a nevükkel hivatkozhatnak. A metódusok használhatják az adattagokat és a többi metódust.
Osztály hatáskör Hatáskörök osztály hatáskör: minden eleme az osztálynak az osztály bármely eleméb l használható metódus hatáskör: formális paraméter a metódus törzsében bárhol használható lokális változó: bevezetést l a metódus végéig. Ha a változót a metódus els sorában vezettük be, akkor megegyezik a formális paraméterével blokk hatáskör: kapcsos zárójelek közötti rész, metóduson belül
Egyszer példa 1 public class Komplex { 2 double _valosresz; 3 double _kepzetesresz; 4 public void Beallit(double valos, 5 double kepzetes) { 6 _valosresz = valos; 7 _kepzetesresz = kepzetes; 8 } 9 public double GetValosResz() { 10 return _valosresz; 11 } 12 }
Outline 1 Bevezetés 2 Osztály létrehozása, deníció Adatszer elemek Függvényszer tagok Osztály hatáskör Hozzáférési kategória this pszeudó változó Parciális (részleges) osztály Elemek használata 3 Létez osztály használata Példányosítás Hivatkozás
Hozzáférési kategória Módosító public protected internal protected internal private Hozzáférési kategória nyilvános: bármely csomagban lev bármely osztályból elérhet. védett, bels : magyarázata majd az öröklésnél védett: magyarázata majd az öröklésnél bels : csak ebb l a szerelvényb l saját: csak ebb l a típusból
Alapértelmezett hozzáférési kategóriák Ha nem adunk meg, akkor attól függ, hogy milyen elemen belül deniáltuk: Minden névtér explicit publikus, és nem lehet megadni semmit Típus deklarálása szerelvényen belül csak public vagy internal lehet, az internal az alapértelmezett. Osztály elemei bármelyik lehet, a private az alapértelmezett. Struktúra, interfész, felsorolt típusoknak majd kés bb.
Hozzáférési kategória használata Az információrejtés alapelvének betartása érdekében minden elem kapja a lehet legsz kebb kategóriát. Szokásos konvenciók: Egy osztály csak akkor legyen public, ha általános használatra szántuk. Az adattagok private (esetleg protected) min sítést kapjanak. Ha szükséges, metódusokon keresztül legyenek elérhet k. A public adattag hiba! A metódusok közül csak a "külvilág" számára szükségesek (az osztály interface-ét jelent k) legyenek public min sítés ek.
Outline 1 Bevezetés 2 Osztály létrehozása, deníció Adatszer elemek Függvényszer tagok Osztály hatáskör Hozzáférési kategória this pszeudó változó Parciális (részleges) osztály Elemek használata 3 Létez osztály használata Példányosítás Hivatkozás
this pszeudó változó Minden objektumhoz saját adattag-készlet tartozik az osztály összes objektumára közös a tagfüggvény-készlet. Kérdés: hogyan tud a tagfüggvény az aktuális objektum adattagjaira hivatkozni? Megoldás: Minden objektumhoz létezik az el redeniált this pszeudó változó, amely az adott objektumra hivatkozik. Ezen keresztül éri el az adattagot a tagfüggvény. A this pszeudó változó explicite is használható.
this pszeudó változó II public double get_valosresz() { return _valosresz; } tehát valójában így olvasandó: public double get_valosresz() { return this._valosresz; } A fordítóprogram természetesen az utóbbi formát is elfogadja.
Outline 1 Bevezetés 2 Osztály létrehozása, deníció Adatszer elemek Függvényszer tagok Osztály hatáskör Hozzáférési kategória this pszeudó változó Parciális (részleges) osztály Elemek használata 3 Létez osztály használata Példányosítás Hivatkozás
Parciális (részleges) osztály Az osztály elemeit több forrás fájlban vezetjük be. A két deklarációt összefésüli, ezért Túl nagy osztály esetén Különböz felel sség esetén pl. Winforms alkalmazásnál a VS által generált kód külön fájl pl. ASP.NET-ben a saját kódunk is parciális osztályban van. ugyanolyan nev elemek nem lehetnek a különböz helyen, osztály módosító csak ugyanolyanok lehetnek.
Outline 1 Bevezetés 2 Osztály létrehozása, deníció Adatszer elemek Függvényszer tagok Osztály hatáskör Hozzáférési kategória this pszeudó változó Parciális (részleges) osztály Elemek használata 3 Létez osztály használata Példányosítás Hivatkozás
Osztályon belül (mivel egy hatáskörben vannak): névvel formája: adattag = ertek vagy metodus(aktualis_aparameterek) metódusban a paraméterre nevévvel Ha a paraméter név megegyezik egy adattag nevével, akkor this.adattag = parameter használható (pl.: this.adat = adat)
Outline 1 Bevezetés 2 Osztály létrehozása, deníció Adatszer elemek Függvényszer tagok Osztály hatáskör Hozzáférési kategória this pszeudó változó Parciális (részleges) osztály Elemek használata 3 Létez osztály használata Példányosítás Hivatkozás
Példányosítás Az osztály objektumok létrehozásához használható mintaként tekinthet. A C# programban az osztálynév típusként használható. Az objektum létrehozásának folyamata a példányosítás. Egy osztályból tetsz leges számú objektum példányosítható.
Példányosítás II A legegyszer bb mód egy osztály típusú változó deniálása. Formája: [módosítók] osztálynév azonosító = new osztálynév([paraméterek]) A () zárójelpár a paraméterek hiányában is kötelez. A folyamat: Lefoglalódik az objektumnak szükséges hely. Inicializálódik az objektum (a programozó befolyásolhatja az inicializálást). A lefoglalt memóriaterületre való hivatkozás kerül a változóba.
Példányosítás példa Az el z Komplex osztályt feltételezve Komplex z1 = new Komplex(); Ennek hatására létrejön egy Komplex objektum, z1 változó alkalmas lesz ennek elérésére.
Példányosítás példa II Ezek után a alábbi utasítások Komplex z2; // Másik változó ami nem hivatkozik semmire z2 = z1; // Az új változó ugyanarra az objektumra hivatkozik. hatására két különböz változó fog ugyanarra az objektumra hivatkozni (azaz a z1 == z2 értéke true).
Outline 1 Bevezetés 2 Osztály létrehozása, deníció Adatszer elemek Függvényszer tagok Osztály hatáskör Hozzáférési kategória this pszeudó változó Parciális (részleges) osztály Elemek használata 3 Létez osztály használata Példányosítás Hivatkozás
Hivatkozás Osztály típusú változó mindig hivatkozás, nem objektum! Hivatkozás típusú változó: értéke cím, amely egy objektumot címez meg, (ebben hasonlít a pointerre) vagy null, használata indirekció nélkül magát az objektumot jelenti a kifejezésekben, az értéke (a cím) a programozó számára hozzáférhetetlen (és szükségtelen is), értéke változhat, de az autómatikus.
Hivatkozás II Következmény: objektum csak futás közben, dinamikusan (a new operátor használatával) hozható létre. Hivatkozással végezhet m veletek: 1 Oszt refval,refval2; // definicio 2 refval = new Oszt(); // ertekadas uj objektummal 3 refval = rafval2; // ertekadas masik referenciaval 4 rafval = null; // ertekadas null-ra 5 if (refval2!= null) // viszgalat 6 refval2.hello();
Hivatkozás példa 1 // osztaly definicio 2 class Person { 3 String name = "Eric"; 4 int age = 25; 5 } 6 7 8 // peldanyositas 9 Person p = new Person();
Hivatkozás diagramja
Hivatkozás diagramja II
Objektum elemeinek a használata Osztályon kívülr l (hivatkozáson keresztül) az objektum (egyes esetekben az osztály) nevével min sítve, a. (pont) operátorral. p.age = 32; Metódusra való hivatkozásnál aktuális paramétereket is kell adni, és a hivatkozás a metódus aktivizálását (meghívását) jelenti. p.refresh(name);
Hivatkozás az objektum elemeire példa Komplex z1 = new Komplex(); z1.valosresz = 5.0; // remeljuk property z1.beallit(1.0, 1.0); A fenti két hivatkozás azonban nem legális minden esetben. Az információrejtés alapelvének megvalósítása érdekében a C# korlátozza az objektumok tagjaira való hivatkozást.
OOP programozás alapelve