# 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