# 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