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!
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.
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!
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
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.
//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);
}