# 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