Interfészek
[email protected] PPT 2007/2008 tavasz http://nik.bmf.hu/ppt 1
Témakörök Polimorfizmus áttekintése Interfészek Interfészek kiterjesztése
2
Már megismert fogalmak áttekintése • • • •
Objektumorientált program felépítése Osztály, objektum Érték típus, referencia típus Öröklődés – egyszeres öröklődés – többszörös öröklődés
• Korai kötés, késői kötés • Absztrakt osztály • Polimorfizmus (többalakúság) – módszer polimorfizmus – objektum polimorfizmus
• Polimorfizmus a gyakorlatban – pl. vizuális felület komponensei
• Az (egyszeres) öröklődés korlátai 3
Témakörök Polimorfizmus áttekintése Interfészek Interfészek kiterjesztése
4
Interfész fogalma • Az interfészek olyan „üres osztályok”, amelyek nem tartalmaznak megvalósítást • 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
• UML jelölések <
> IComperable +equals( ) +more( ) +less( )
interfész definíció
Number IComperable +equals( ) +more( ) +less( )
interfész megvalósítás 5
Interfész felépítése • Interfész tipikusan 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) – statikus mezőt mivel ezek nem igényelnek objektum példányt – konstans mezőt szintén 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
• Különböző módosítók (láthatóság stb.) az osztályokhoz hasonló módon használhatók, bár nyelvtől függően eltérések is lehetnek 6
Interfész megvalósítása (támogatá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 • Az interfész megvalósításának lépései – osztály definícióban a megvalósítandó interfészek felsorolása – az interfész(ek)ben definiált metódusok implementálása
• 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 • Egy osztálynak kötelező implementálnia az általa megvalósított interfészek által definiált metódusokat (ellenkező eset fordítási hibát eredményez) • Kivéve az absztrakt osztályokat, ahol nem szükséges minden metódust megvalósítani 7
Implicit/explicit interfész megvalósítás • A többszörös öröklésnél felmerülő problémák közül néhány felmerül a több hasonló interfészt megvalósító osztályok esetén is • Több interfész is tartalmazhat ugyanolyan szignatúrájú metódusokat, ennek kezelése érdekében kétféle interfész megvalósítást használhatunk • 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 8
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 T típusú osztályra az alábbi típusú referenciákkal hivatkozhatunk (más típus fordítási hibát eredményez): – T típusú referenciával – T valamelyik őstípusának referenciájával – T osztály által megvalósított valamelyik interfész típusának referenciájával – (egyéb: konverziók, casting stb.)
• Az interfész típusú referenciák az osztály típusú referenciákhoz hasonló módon működnek • Ez nem keverendő össze azzal, hogy az interfész típusból nem lehet példányt létrehozni! 9
Témakörök Polimorfizmus áttekintése Interfészek Interfészek kiterjesztése
10
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)
11
Osztály hierarchia • Amennyiben egy osztály megvalósít egy interfészt, akkor a leszármazottjai is mind megvalósítják. Ennek direkt jelölésére általában nincs szükség • A megvalósító metódusokat a leszármazottak öröklik, így értelemszerűen nincs szükség további követelmények teljesítésére • Egy T típusú osztályra tehát az alábbi típusú referenciákkal hivatkozhatunk: – T típusú referenciával – T valamelyik őstípusának referenciájával – T osztály által megvalósított valamelyik interfész típusának referenciájával – T osztály bármelyik őse által megvalósított interfész típusának referenciájával – T osztály által megvalósított interfész bármelyik őstípusának referenciájával – (egyéb: konverziók, casting stb.) 12
Néhány további gondolat • Jelölő interfészek (marker interface) – nincsenek metódusaik – az osztályhoz rendelve futás közben lekérdezhetők, ezzel a futtató környezet (vagy reflexión keresztül az egyéb programok) számára nyújt információt – ha van helyette más nyelvi elem, célszerű elkerülni a használatát
• Segítő osztályok (helper class) – egy összetett interfész esetén gyakran csak néhány metódus megvalósítására lenne szükség, azonban mindig kötelező mindet implementálni – kényelmi szempontból az interfészekhez gyakran készítenek egyszerű, az interfészt üres (vagy alapértelmezett kóddal) megvalósító ún. segítő osztályokat
• Nem célszerű interfészt új metódusokkal bővíteni, mivel így az ezt implementáló osztályok fordíthatatlanná válnak 13
Javasolt/felhasznált irodalom • BMF NIK – AAO, OOP, VEP előadások • J. Richter: CLR via C# 2nd edition Microsoft press, 2006
14