C# objektumorientált programozás

11. osztály 11.évf_c# C# programozás Programozás

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);
            }