Bevezetés
Osztály létrehozása, deníció
Létez® osztály használata
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
Bevezetés
Osztály létrehozása, deníció
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
Létez® osztály használata
Bevezetés
Osztály létrehozása, deníció
Létez® osztály használata
Osztály - egység
Önálló hatáskörrel rendelkez®, adattípus melyben logikailag összetartozó elemek találhatóak: adatszer¶ függvény szer¶
Bevezetés
Osztály létrehozása, deníció
Létez® osztály használata
Osztály deklaráció
attributesopt class-modiersopt partialopt type-parameter-listopt class-baseopt type-parameter-constraints-clausesopt
class-body ;opt
1 class Pelda 2 { 3 }
class identier
Bevezetés
Osztály létrehozása, deníció
Osztály módosítók
Egy módosító csak egyszer szerepelhet! new public protected internal private abstract sealed static
Létez® osztály használata
Bevezetés
Osztály elemei
Osztály létrehozása, deníció
Létez® osztály használata
Bevezetés
Osztály létrehozása, deníció
Létez® osztály használata
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)
Bevezetés
Osztály létrehozása, deníció
Létez® osztály használata
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)!
Bevezetés
Osztály létrehozása, deníció
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
Létez® osztály használata
Bevezetés
Osztály létrehozása, deníció
Létez® osztály használata
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 2 3 4 5
class Pelda { private int _filed1; private int _filed2 = 7; }
Bevezetés
Osztály létrehozása, deníció
Létez® osztály használata
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
Bevezetés
Osztály létrehozása, deníció
Létez® osztály használata
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)
Bevezetés
Osztály létrehozása, deníció
Létez® osztály használata
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.
Bevezetés
Osztály létrehozása, deníció
Létez® osztály használata
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; }
Bevezetés
Osztály létrehozása, deníció
Tulajdonság váz
[attributes] [modifers]
<property-name> { [ set {
[ get {
} ]
}
} ]
Létez® osztály használata
Bevezetés
Osztály létrehozása, deníció
Létez® osztály használata
Tulajdonság példakód 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
public class
Button: Control
{
caption; Caption {
private string public string get { return
caption;
} set {
if (caption != value) {
caption = Repaint();
value;
} } }
Paint(Graphics g, Rectangle r) // Painting code goes here
public override void } }
{
Bevezetés
Osztály létrehozása, deníció
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
Létez® osztály használata
Bevezetés
Osztály létrehozása, deníció
Létez® osztály használata
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!)
Bevezetés
Osztály létrehozása, deníció
Létez® osztály használata
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.
Bevezetés
Osztály létrehozása, deníció
Létez® osztály használata
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.
Bevezetés
Osztály létrehozása, deníció
Létez® osztály használata
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] <property-name> { [ set {
[ get {
} ]
}
} ]
Bevezetés
Osztály létrehozása, deníció
Létez® osztály használata
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); } }
Bevezetés
Osztály létrehozása, deníció
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
Létez® osztály használata
Bevezetés
Osztály létrehozása, deníció
Létez® osztály használata
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.
Bevezetés
Osztály létrehozása, deníció
Létez® osztály használata
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
Bevezetés
Osztály létrehozása, deníció
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 }
Létez® osztály használata
Bevezetés
Osztály létrehozása, deníció
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
Létez® osztály használata
Bevezetés
Osztály létrehozása, deníció
Létez® osztály használata
Hozzáférési kategória
Módosító
Hozzáférési kategória
public
nyilvános: bármely csomagban lev®
protected internal
védett, bels®: magyarázata majd az
bármely osztályból elérhet®. öröklésnél protected
védett: magyarázata majd az öröklésnél
internal
bels®: csak ebb®l a szerelvényb®l
private
saját: csak ebb®l a típusból
Bevezetés
Osztály létrehozása, deníció
Létez® osztály használata
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.
Bevezetés
Osztály létrehozása, deníció
Létez® osztály használata
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.
Bevezetés
Osztály létrehozása, deníció
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
Létez® osztály használata
Bevezetés
Osztály létrehozása, deníció
Létez® osztály használata
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ó.
Bevezetés
Osztály létrehozása, deníció
Létez® osztály használata
this pszeudó változó II
public double get_valosResz() { return tehát valójában így olvasandó: public double get_valosResz() { return
_valosResz;
}
this._valosResz; }
A fordítóprogram természetesen az utóbbi formát is elfogadja.
Bevezetés
Osztály létrehozása, deníció
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
Létez® osztály használata
Bevezetés
Osztály létrehozása, deníció
Létez® osztály használata
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.
Bevezetés
Osztály létrehozása, deníció
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
Létez® osztály használata
Bevezetés
Osztály létrehozása, deníció
Létez® osztály használata
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)
Bevezetés
Osztály létrehozása, deníció
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
Létez® osztály használata
Bevezetés
Osztály létrehozása, deníció
Létez® osztály használata
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ó.
Bevezetés
Osztály létrehozása, deníció
Létez® osztály használata
Példányosítás II
A legegyszer¶bb mód egy osztály típusú változó deniálása.
osztálynév azonosító = new osztálynév([paraméterek]) Formája: [módosítók]
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.
Bevezetés
Osztály létrehozása, deníció
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.
Létez® osztály használata
Bevezetés
Osztály létrehozása, deníció
Létez® osztály használata
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).
Bevezetés
Osztály létrehozása, deníció
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
Létez® osztály használata
Bevezetés
Osztály létrehozása, deníció
Létez® osztály használata
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.
Bevezetés
Osztály létrehozása, deníció
Létez® osztály használata
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 2 3 4 5 6
Oszt refVal,refVal2; // definicio refVal = new Oszt(); // ertekadas uj objektummal refval = rafVal2; // ertekadas masik referenciaval rafval = null; // ertekadas null-ra if (refVal2 != null) // viszgalat refVal2.Hello();
Bevezetés
Osztály létrehozása, deníció
Hivatkozás példa
1 2 3 4 5 6 7 8 9
// osztaly definicio class Person { String name = "Eric"; int age = 25;
}
// peldanyositas Person p = new Person();
Létez® osztály használata
Bevezetés
Osztály létrehozása, deníció
Hivatkozás diagramja
Létez® osztály használata
Bevezetés
Osztály létrehozása, deníció
Hivatkozás diagramja II
Létez® osztály használata
Bevezetés
Osztály létrehozása, deníció
Létez® osztály használata
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);
Bevezetés
Osztály létrehozása, deníció
Létez® osztály használata
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.
Bevezetés
Osztály létrehozása, deníció
OOP programozás alapelve
Létez® osztály használata