1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz
2 Adattag : Az osztály mezői, amelyek az objektum állapotát tárolják. Kétfajta mező létezik: Példányszintű mező: ebből annyi darab lesz, ahány példányt készítünk az adott osztályból. Minden példánynak saját mezője lesz, ezek nem közösek a példányok között. A mező elérése: … példánynév.mezőnév … Osztályszintű mező: ebből az egész program futása során 1 db lesz, függetlenül attól, hány példányt készítünk (akár ha 0 db-t is). Ezen mezőt minden példány (is) elérheti, a mező közös a példányok között. A mező elérése: … osztálynév.mezőnév …
3 class TKutya { public static bool tudRepulni = false; public static bool tudUszni = true; public static int labakSzama = 4; public double sulya; public string neve; }; public static void Main() { TKutya bloki = new TKutya(); bloki.sulya = 4.3; bloki.neve = ”Bodri”; bloki.tudRepulni = true; // hibás TKutya.tudRepulni = true; // jó } public static void Main() { TKutya bloki = new TKutya(); bloki.sulya = 4.3; bloki.neve = ”Bodri”; bloki.tudRepulni = true; // hibás TKutya.tudRepulni = true; // jó } STATIC kulcszó: osztálymező Jelöletlen mező: példányszintű Új ‘TKutya’ létrehozása = double+string memóriaigénye.
4 Konstans : Az osztály olyan mezője, amely a kezdőértékadás során kapja meg az értékét, és később ezt már nem lehet megváltoztatni. Minden konstans egyúttal osztályszintű mezőnek minősül. Hivatkozni ezért osztálynéven keresztül lehet rá: … osztálynév.konstansnév … class TKor { public const double Pi = 3.14; public double sugar; } class TKor { public const double Pi = 3.14; public double sugar; } TKor kor = new TKor(); kor.sugar = 12.4; double kerulet = TKor.Pi * kor.sugar * kor.sugar; TKor kor = new TKor(); kor.sugar = 12.4; double kerulet = TKor.Pi * kor.sugar * kor.sugar; Osztályon kívül az elérés osztálynéven keresztül
5 class TKor { public const double Pi = 3.14; public double sugar; public double kerulet() { return sugar*sugar*Pi; } class TKor { public const double Pi = 3.14; public double sugar; public double kerulet() { return sugar*sugar*Pi; } TKor kor = new TKor(); kor.sugar = 12.4; double k = kor.kerulet(); TKor kor = new TKor(); kor.sugar = 12.4; double k = kor.kerulet(); Osztályon belül az elérés közvetlen.
6 Az osztályok a mezőkön kívül fv-eket és eljárásokat tartalmaznak. Ezeket közös néven metódusoknak nevezzük. Kétfajta metódust ismerünk: Példányszintű metódus: meghívása példányon keresztül történhet. Hozzáfér az osztály példányszintű és osztályszintű mezőihez is. Osztályszintű metódus: meghívása osztáynéven keresztül történik. Nem férhet hozzá példányszintű mezőkhöz, csak osztályszintűekhez.
7 class TAllat { public int xPos, yPos; public double Menj(int ujX, int ujY) { xPos = ujX; yPos = ujY; } class TAllat { public int xPos, yPos; public double Menj(int ujX, int ujY) { xPos = ujX; yPos = ujY; } TAllat kacsa = new TAllat(); kacsa.Menj(10,20); TAllat macska = new TAllat(); macska.Menj(30,20); TAllat kacsa = new TAllat(); kacsa.Menj(10,20); TAllat macska = new TAllat(); macska.Menj(30,20);
8 class TTermeszet { static public string Evszak; public void evszakValt() { switch(Evszak) { ”nyár”: Evszak = ”ősz”;break; ”ősz”: Evszak = ”tél”;break;... } class TTermeszet { static public string Evszak; public void evszakValt() { switch(Evszak) { ”nyár”: Evszak = ”ősz”;break; ”ősz”: Evszak = ”tél”;break;... } TTermeszet.Evszak = ”tavasz”; TTermeszet.evszakValt(); string most = TTermeszet.Evszak; TTermeszet.Evszak = ”tavasz”; TTermeszet.evszakValt(); string most = TTermeszet.Evszak; Nem túl szerencsés megoldás.
9 Osztályszintű metódust alkalmazunk, ha: A metódus futásához minden információt paraméterként adunk át: class Math { public static double Sin( double degree ) {... } class Math { public static double Sin( double degree ) {... }
10 Osztályszintű metódust alkalmazunk, ha: Az adott osztályból úgysem lesz példányosítva, mert úgyis csak 1 db példány lenne belőle. Ekkor az osztály minden mezője osztályszintű, és minden metódusa osztályszintű: class Console { public static double WriteLine(...) {... } class Console { public static double WriteLine(...) {... }
11 Osztályszintű metódust alkalmazunk, ha: Az adott metódus nem hivatkozik példányszintű mezőre, sem metódusra. Csak az osztályszintű mezőkkel dolgozik: class TTermeszet { static public string Evszak; public void evszakValt() { switch(Evszak) { ”nyár”: Evszak = ”ősz”;break; ”ősz”: Evszak = ”tél”;break;... class TTermeszet { static public string Evszak; public void evszakValt() { switch(Evszak) { ”nyár”: Evszak = ”ősz”;break; ”ősz”: Evszak = ”tél”;break;...
12 Osztályszintű metódusból hívhatunk másik metódust, de csak ha az is osztályszintű! Példányszintű metódus hívására nincs lehetőség ( ugyanis példányszintű metódus hívásához példány is kellene ) class TTermeszet { static public string Evszak; static public int datum; public void datumNovel() { datum ++; if (datum==60) // március 1 evszakValt() ; class TTermeszet { static public string Evszak; static public int datum; public void datumNovel() { datum ++; if (datum==60) // március 1 evszakValt() ;
13 Példányszintű metódusból meghívhatunk másik példányszintű metódust is, és osztályszintű metódust is. class TKutya { double sulya = 10; public void eszik() { sulya += 0.1; // 10 dekát hízik vakkantas(); } public void vakkantas() { Console.Write(”vau-vau”); } class TKutya { double sulya = 10; public void eszik() { sulya += 0.1; // 10 dekát hízik vakkantas(); } public void vakkantas() { Console.Write(”vau-vau”); }