Az obejktum orientált programozás célja, hogy egyszerűsítse a szoftver tervezést és megvalósítást. Az objektum orientált programozás alapelemei az osztályok. Egy osztály tartalmazhat változókat és metódusokat. Az osztályokból készülnek tulajdonképpen az objektumok (példányok).
Például: készítünk egy Ember osztályt, amelynek 3 tulajdonsága lesz: név (string) kor (int) település (string). Ebből készíthetünk el egy konkrét személyt valamilyen konstruktorral. Lásd: 3.példa.
Fogalmak:
Osztály: egy sablon, ami alapján létrehozzuk az objektumokat.
Konstruktor: Olyan metódus, ami az objektum létrehozásakor automatikusan lefut. Általában a tagváltozóknak adunk vele kezdőértéket.
Objektum, példány: a valóság modellezendő része. Logikailag összetartozó rész. Részei a tagváltozók és a metódusok. Példányosítás: amikor egy osztály alapján hozunk létre objektumot.
Tagváltozó: az objektum adattárolásra használt részei, az objektum tulajdonságait tárolják.
Metódus: eljárás, vagy függvény, ami az adott objektumon műveletet végez.
Statikus tagválltozó: osztályon belüli változó, amit az osztály minden példánya használhat.
Statikus metódus: osztályon belüli közös metódus. Használhatjuk vele a statikus tagváltozókat.
Encapsulation (beburkolás): privát adattagok és metódusok használatát jelenti az osztályokban. Az encapsulation biztosítja, hogy az osztályok adattagjai csak a metódusokon keresztül érhetőek el, ami megakadályozza az adatok véletlen módosítását és a program hibáit. Az objektumok elrejtik belső állapotukat a külvilág elől.
Inheritance (öröklődés): lehetővé teszi az osztályok tulajdonságainak, viselkedésének öröklődését. Ezek alapján új osztályokat is létre lehet hozni egyszerűen.
Polimorfizmus: lehetővé teszi, hogy az osztályok metódusai a különböző paraméterekre más és más módon reagáljanak.
Absztrakció: segít modellezni a valós világ dolgait.
Tagváltozók és metódusok hozzáférési szabályai:
Public: a programból bárhonnan elérhetőek
Private: csak abból az osztályból elérhetőek, ahol létrehoztuk (deklaráltuk) őket
Protected: nem csak a saját osztályból, hanem a leszármazottakból is elérhetőek.
Rövidítés
Sok érettségi feladatban látunk ilyen jelet => Mit jelent? Ez egy rövidítés. (property expression)Például van egy azonosító kódja minden személynek, aminek az utolsó karaktere f (férfi) vagy n (nő). Készítsünk egy függvényt, ami nők esetében igaz értéket ad vissza!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
public bool Holgy=> Azonosito.Last() == 'n'; // ez van rövidítve: ha az utolsó karakter = n akkor igaz értéket ad. public bool Holgy { get { return Azonosito.Last() == 'n'; } } //Nobel díjak érettségi feladat public int ElethosszEvekben => Tol == -1 || Ig == -1 ? -1 : Ig - Tol; //Ez a sor kifejtve: public int ElethosszEvekben { get { if (Tol == -1 || Ig == -1) { return -1; } else { return Ig - Tol; } } } //Még egy példa a Nobel díjas feladatból: public bool IsmertAzElethossz => ElethosszEvekben != -1; // Kifejtve: public bool IsmertAzElethossz { get { return ElethosszEvekben != -1; } } |
Példák, feladatok
példa1: saját osztály létrehozása: class kulcsszó, nagybetűs névvel célszerú jelölni. A példány létrehozásánál hasonlóan járunk el, mint a változóknál: megnevezzük az osztályt, majd az objektumot. Ennek az osztálynak lesz 2db tagváltozója is. Ezeknek adunk 1-1 értéket is.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
namespace osztalyokpelda { class Sajatosztaly { public int tagvaltozo1; public int tagvalzoto2; } class program { static void Main(string[] args) { Sajatosztaly peldany1 = new Sajatosztaly(); peldany1.tagvaltozo1 = 1999; peldany1.tagvaltozo2 = 2020; Console.WriteLine(peldany1.tagvaltozo1/peldany1.tagvaltozo2); Console.ReadLine(); } } } |
példa2: osztály bővítése eljárással. Kérjük be a tagváltozók értékét eljárás segítségével!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
namespace osztalyokpelda { class Sajatosztaly { public int tagvaltozo1; public int tagvalzoto2; public void adatbeker() { Console.WriteLine("Tagváltozó1:"); tagvaltozo1= Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Tagváltozó2:"); tagvalzoto2= Convert.ToInt32(Console.ReadLine()); } } class program { static void Main(string[] args) { Sajatosztaly peldany1 = new Sajatosztaly(); peldany1.adatbeker(); Console.WriteLine(peldany1.tagvaltozo1/peldany1.tagvaltozo2); Console.ReadLine(); } } } |
példa 3: Olvassuk be személyek adatait (név, kor, település: Teszt Elek, Békéscsaba, 33) egy txt fájlból. Minden sor egy személy adatait tartalmazza. Az adatokat tároljuk el listában, amihez készítünk egy saját osztályt is.
Először definiáljuk saját osztályunkat, amelynek a struktúráját a beolvasni kívánt adatoknak megfelelően alakítjuk ki. class Ember…
Ezután beolvassuk a szöveges fájlt soronként, és minden sorát átalakítjuk egy ember osztálypéldánnyá: A beolvasást a StreamReader végzi, soronként képes adatokat beolvasni fájlból. A while ciklus addig fut, amíg a fájl végére nem ér.
Az adatok[] tömbbe olvasunk be egy konkrét sort a txt-ből, majd daraboljuk szét a sor.Split(‘,’) segítségével. Az Ember ember = new Ember(); tehát az aktuális személyt jelenti, akinek az adatait éppen feldolgozzuk. Ember a típusa, hiszen ez az osztályunk neve. Ennek az adott személynek mentjük el külön-külön az adatait. ember.Nev = adatok[0] Tehát az adatok tömb 0. eleme lesz a neve. Ha minden adatát beolvastuk, akkor az ember objektumot hozzáadjuk a lista nevű listához.
Ha szeretnénk kiíratni valamelyik személy adatait, akkor a listaelem indexével, és a tulajdonságával tudjuk ezt megtenni.
Tehát az első személy, aki a txt-ben volt, lesz a lista[0] Ezt így nem lehet még kiíratni, meg kell adni, konkrétan melyik adatát akajuk kiválasztani. A neve így néz ki: lista[0].nev
Az összes adata: lista[0].Nev, lista[0].Kor, lista[0].Varos
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
public class Ember { public string Nev { get; set; } public int Kor { get; set; } public string Varos { get; set; } } static void Main(string[] args) { // string elsosor; List<Ember> lista = new List<Ember>(); using (StreamReader sr = new StreamReader("emberek.txt")) { string sor; //elsosor = sr.ReadLine(); while ((sor = sr.ReadLine()) != null) { string[] adatok = sor.Split(','); Ember ember = new Ember(); ember.Nev = adatok[0]; ember.Kor = int.Parse(adatok[1]); ember.Varos = adatok[2]; lista.Add(ember); } } Console.WriteLine("Ennyi adat van a txt-ben: {0}", lista.Count); //első ember adatai Console.WriteLine("{0} {1} {2}", lista[0].Nev, lista[0].Kor, lista[0].Varos); Console.ReadKey(); |
Ha esetleg van fejléc a txt fájlban, mint érettségin, akkor az első sort be lehet olvasni egy plussz változóba., majd utána folytatni a while ciklussal.
Ha a File.ReadAllLines-t használjuk, akkor így néz ki a beolvasás:
Ha van fejléc, de nem kell, mint pl. a 2022-es SuperBowl feladatnál, a for ciklus 1-től megy nem 0-tól.
Ha mégis kell a fejléc, akkor egy if segítségével el tudjuk menteni a 0. sor értékét külön.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
//lista előtt: string fejlec = null; string[] sorok = File.ReadAllLines("emberek.txt"); for (int i = 0; i < sorok.Length; i++) { string sor = sorok[i]; // if (i == 0) { // fejlec = sor; // continue; // } string[] adatok = sor.Split(','); Ember ember = new Ember(); ember.Nev = adatok[0]; ember.Kor = int.Parse(adatok[1]); ember.Varos = adatok[2]; lista.Add(ember); } |