Interfészek szenasi.sandor@nik.bmf.hu 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 <<interface>> IComperable +equals( ) +more( ) +less( ) IComperable Number +equals( ) +more( ) +less( ) interfész definíció 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