# Objektumorientált programozás
## Osztály öröklődés
- **Redundáns** kódot nem engedünk meg
- felesleges
- nehezen variálható
- spagetti kód lesz belőle >:(
- Alacsonyabb szintena a kiemelés azt jelenti hogy
- az ismétlődő értékeket leváltjuk konstansokra
- és az ismétlődő utasításokat leváltjuk ciklusokra
- **!!OSZTÁLY SZINTEN A KIEMELÉS AZ ÖRÖKLŐDÉS!!**
- **Öröklődés definíciója: Az öröklődés olyan eszköz amely lehetővé teszi hogy egy vagy több osztályt leszármaztassunk egy másik osztályból, ezek rendelkeznek az előző osztály tulajdonságaival szerkezetével és viselkedésével.**
- A leszármaztatott osztályokban csak a változtatásokat kell megírni
- *~~A leszármazottak bővíthetik vagy szűkíthetik az őstípus állapotterét,működését~~*
- *~~**Többszörös öröklés**: a leszármaztatott ilyenkor több azonos nevűt is örökölhet~~*
- **Többszörös öröklés problémái**
- A leszármazottak több ős esetén több azonos nevű metódust örökölhetnek (ami nem jó)
- Ha egy osztály több ősének is van egy korábbi közös őse, akkor ennek metódusait a végső leszármazott több féle megvalósítással is megkaphatja
- Osztályhierarchia: egymásból leszármazó osztályok hierarchikus rendeszere
- **Ős**: a származási fa magasabb szintű eleme
- **Leszármaztatott**: az ős alacsonyabb szintű eleme
- **Közvetlen ős**:osztályhierarchiában egy szinttel magasabban ős
- Konstruktor
- **Explicit konstruktorhívás:** a leszármaztatottban meghívjuk az ős „egyik” konstruktorát, ezzel inicializáljuk a mezöket
- **Automatikus konstruktorhívás**: ha nincs explicit konstruktor, akkor automatikusan az üres konstruktor hívódik meg.
- **Konstruktor hívásisorrend**: származási hierarchia esetén minden ős konstruktora lefut a származási sorrend szerint
- láthatósági szintek
- **private**: csak a megadott osztály metódusai éri el
- **protected**: megadott osztály és leszármazottjainak metódusai érik el
- **public**: minden osztály metódusa eléri, a külvilág által látható felület
- **static** példányositás nélkül lehivható
## Polimorfizmus
- Primitiv típusok esetében a változó neve közvetlenül az adatok tárolására szolgáló rekeszre mutat így a deklarált változó típusa megegyezik az eltároltadat típusával Pl.: int típusú számot csak int típusú tömbe tehetünk bele
- 20???
- referrencia: objektum azonositása memóriában, tiupst is jelent pl. Termek peldany; ennek a refernciája a Termek
- ös osztály refernciájával csak az ösben található metódusok érhetőek el
```csharp
Termek peldany;
peldany= new AkciosPeldany()
peldany.fizetendo()
```
- Melyik fog lefutni termek vagy a akciós termék metódusa?
- Korai kötés
- forditáskor eldöl hogy az ös metódus fut le
- elönyei
- Egyszerű megvalósítás
- Nincs futásidejű teljesítményveszteség
- Hátrányai
- Nem alkalmas polimorfizmus megvalósítására
- Késői kötés
- referencia által hivatkozott objektum valódi típusának megfelelő osztály metódusa hívódik meg, vagyis Az akicósPéldány
- **dinamikus kötés**-nek is hivják mivel futásidöben derül ki hogy mi fog lefutni
- Előnyei
- Rugalmasság
- Polimorfizmus lehetősége
- Hátrányai
- Teljesítményveszteség
- Nagyobb tárigény
- Bonyolultabb megvalósítás
- A kötési módot nem meghíváskor kell megadnunk, hanem a metódus megvalósításakor
- Nemvirtuális metódus: mindig korai kötésü és nem lehet felüldefiniálni
- Virtuális metódus: mindig késöi kötést használ és felüldefiniálható
- A virtuális metódus a polimorfizmuson keresztül az OOP egyik legfontosabb alapköve
- Polimorfizmus (többalakúság) azt jelenti, hogy ugyanarra az üzenetre különböző objektumok különbözőképpen reagálhatnak
- Asszociáció: osztályok közötti tetszőleges viszony
- asszociációs kapcsolat áll fennt két osztály között ha az egyiknek a saját helyes működéséhez ismernie kell a másikat. pl használja/tartalmazza a másikat.
- Aggregáció: asszociáció speciális esete: tartalmazási kapcsolat
- Kompozíció: aggregáció speciális esete: szigorú tilalmazási kapcsolat