---
# System prepended metadata

title: AZ INTERFACEK

---

# AZ INTERFACEK
- Az interfész meghatározza egy osztály felületét
    - Másként megfogalmazva: egy szerződés, ami kikényszeríti, hogy az interfészt megvalósító osztályok rendelkezzenek bizonyos műveletekkel
- Interfészek néhány tipikus alkalmazása
     - Osztályok felruházása valamilyen műveletekkel (nevet rendel metódus szignatúrák egy csoportjához)
    - Többszörös öröklődés egyszerűsített megvalósítása (polimorfizmus lehetőségeinek elérésére)
- Tartalom
    - Interfész tipikusan (nyelvtől függően) tartalmazhat
        - Metódus szignatúrát
        - szignatúra: metódus neve + visszatérési értéke + paraméterek (interfész metódus mindig virtuális és absztrakt)
        - Konstans mezőt: mivel ezek nem igényelnek objektum példányt
        - Tulajdonságot (amennyiben a nyelv támogatja)
    - Interfész nem tartalmazhat
        - Konkrét metódus, tulajdonság implementációt
        - Példányszintű mezőt
        - Példányosításhoz kapcsolódó konstruktort/destruktort
- Interfész megvalósítása
    - Interfészek önmagukban nem példányosíthatók, csak az őket megvalósító osztályokon keresztül érhetők el a műveleteik
    - Egy osztály egyszerre tetszőleges számú interfészt valósíthat meg, ezzel a polimorfizmus szempontjából a többszörös örökléshez hasonló eredményt érhetünk el
    - Az interface-t megvalósitó osztálynak kötelező megvalósítania az interface metódusait 
    - Ez nem vonatkozik az absztrakt osztályokra, akik ezt a leszármazottakra hárítják
- Interfész típusú referencia
    - Az interfészek tulajdonképpen típusok, ezért lehetséges ilyen típusú változók deklarációjára is
    - Egy ilyen változóval hivatkozhatunk bármilyen objektumra, amely megvalósítja az adott interfészt
    - Az interfész típusú referenciák az osztály típusú referenciákhoz hasonló módon működnek
- Interfész hierarchia
    - Az osztályokhoz hasonlóan az interfészek között is fel lehet építeni egy öröklődési hierarchiát (öröklődés helyett itt gyakran a kiterjesztés szót használjuk)
    - Az osztályok és az interfészek hierarchiája egymástól független, interfész őse nem lehet osztály és osztály őse sem lehet interfész (az osztályok közti öröklést és az interfész megvalósítását tekintsük különbözőnek)
    - Az osztályokhoz hasonlóan az interfészek is általában mind egy legmagasabb szintű ősből származnak
    - Az osztályokhoz hasonlóan a polimorfizmus előnyeit az interfészek között is alkalmazhatjuk (minden interfész használható bármelyik őse helyén)
- Interfész – absztrakt osztályok kapcsolata
    - Más a cél
        - Az absztrakt osztályok egy részben elkészült osztálynak tekinthetők
        - Az interfészek egy követelményrendszernek tekinthetők, és nem adnak impelementációt
    - Osztály és interfész hierarchia egymástól független
    - A kapcsolat csak ott jelenik meg, amikor egy osztály megvalósít egy interfészt
- Többszörös öröklés korlátai
    - Osztályok között nincs többszörös öröklésre lehetőség (legalábbis C#-ban)
    - Egy interfész több interfész leszármazottja is lehet, és egy osztály megvalósíthat több interfészt is
- Implicit/explicit interfész megvalósítás
    - Több interfész is tartalmazhat ugyanolyan szignatúrájú metódusokat
    - Implicit megvalósítás
        - Az osztály metódusának a szignatúrája megegyezik az interfész(ek)ben megadott szignatúrával
        - Bármelyik interfésszel hivatkozunk az osztályra, mindig ugyanaz a metódus fut le
    - Explicit megvalósítás:
        - Az osztályban a metódus neve mellett megadjuk az általa megvalósított interfész nevét is
        - Attól függően, hogy melyik interfésszel hivatkozunk az osztályra, mindig a megfelelő metódus fut le
        - Célszerű ezt a megvalósítást használni 
- Ősre vonatkozó követelmény kiküszöbölése
    - Szeretnénk szétválasztani az objektumok létrehozását azok használatától
    - Egy objektum gyár létrehoz (ha szükséges) és visszaad új objektumokat, esetenként valamilyen paraméter alapján 
- Modulok összekapcsolása
    - Nagyobb rendszerekben célszerű minél kisebb függőségeket kialakítani az egyes modulok között
    - Jobban áttekinthető
    - Könnyebben karbantartható
    - Az interfészek erre jó lehetőséget adnak
        - Egy magasabb absztrakciós szintet nyújt, ami leegyszerűsíti az egész rendszer áttekintését
        - Elrejti a konkrét megvalósítást, így a használója biztos nem fog a megvalósítástól függő kódot írni
