Interfészek előadás http://nik.uni-obuda.hu/prog2 Szénási Sándor szenasi.sandor@nik.uni-obuda.hu Óbudai Egyetem,Neumann János Informatikai Kar
Polimorfizmus áttekintése Interfészek Interfészek alkalmazása Interfészek kiterjesztése Interfészek
3 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
Polimorfizmus áttekintése Interfészek Interfészek alkalmazása Interfészek kiterjesztése Interfészek
5 Interfész szükségessége Emlékeztető: hozzáférési szintek Nincs szükség egy másik osztály belső szerkezetének ismeretére Egy osztály kódja ugyanis bármikor megváltozhat Másik osztály mezőinek használata problémás Mező megszűnik Mező működése megváltozik Távoli módosítások veszélye, hibakeresés problémája Elég a másik osztály metódusainak használata Tulajdonságokat is ide érthetjük Nincs szükség a pontos implementáció ismeretére A fentiekből adódik, hogy egy objektum használatához nem kell ismernünk magát az osztályt, elég egy egyszerűsített felület azokhoz a metódusokhoz és tulajdonságokhoz, amelyeket elérhetünk
6 Interfész fogalma 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) Jelölések Interfész definíció Interfész megvalósítás <<interface>> IÖsszehasonlítható Egyenlő() Több() Kevesebb() IÖsszehasonlítható Szám érték: Szám Egyenlő() Több() Kevesebb()
7 Interfész felépítése 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 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
8 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) Ez nem vonatkozik az absztrakt osztályokra, akik ezt a kötelezettségüket a leszármazottakra hárítják
9 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 Ez nem keverendő össze azzal, hogy az interfész típusból nem lehet példányt létrehozni! Eddig tanultak kiegészítése: 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, castolás, stb.)
10 Interfész absztrakt osztályok kapcsolata Bár szintaktikailag hasonlítanak egymásra, a két technika egymástól függetlenül kezelendő Más a cél Az absztrakt osztályok egy részben elkészült osztálynak tekinthetők, ahol néhány metódust még nem tudtunk megvalósítani. De lehetnek mezőik, egyéb metódusaik, stb. Az interfészek egy követelményrendszernek tekinthetők. Csak azt írják elő, hogy milyen metódusokkal kell a megvalósítónak rendelkeznie, de ehhez nem adnak implementációt Osztály és interfész hierarchia egymástól független Az absztrakt osztályok a hagyományos osztály öröklési hierarchia részei Az interfészek egy ettől független hierarchiát alkotnak 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 (kivéve ahol mégis) Egy interfész több interfész leszármazottja is lehet, és egy osztály megvalósíthat több interfészt is
11 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
Polimorfizmus áttekintése Interfészek Interfészek alkalmazása Interfészek kiterjesztése Interfészek
13 Funkciók kikényszerítése Az interfész tulajdonképpen egy szerződés, meghatároz bizonyos szignatúrákat, amelyeket az interfészt megvalósító objektumoknak kötelezően implementálniuk kell Ennek megfelelően biztosak lehetünk benne, hogy minden, az interfészt megvalósító objektum rendelkezni fog a szükséges metódusokkal Rendezés megvalósítása <<interface>> Interfész definiálása IÖsszehasonlítható IÖsszehasonlítható interfész Kisebb(Objektum) : Logikai metódus Rendezés elkészítése IÖsszehasonlítható objektumok rendezése Kisebb(Objektum) : Logikai metódus segítségével Interfész megvalósítása IÖsszehasonlítható interfészt megvalósító osztály készítése Objektumok példányosítása, majd ezek rendezése Kisebb(Objektum) : Logikai
Polimorfizmus interfészekkel szenasi.sandor@nik.uni-obuda.hu 14 NeptunFelhasználó Diák Oktató <<interface>> Név() : Szöveg ÜzenetKüldés(Szöveg) Szolgáltató Orvos Szerelő címjegyzék : IEIérhető[ ] ChatPartner Diák Szerelő Facebook EmailCím Skype Orvos Skype Diák
Polimorfizmus interfészekkel (2) szenasi.sandor@nik.uni-obuda.hu 15 NeptunFelhasználó Diák Oktató ITalálkozó <<interface>> Név() : Szöveg ÜzenetKüldés(Szöveg) Szolgáltató ITalálkozó Orvos Szerelő <<interface>> ITalálkozó Időpontkérés() : Idő Időpontfoglalás(Idő) címjegyzék : IEIérhető[ ] naptár : ITalálkozó[ ] ChatPartner Diák Oktató Szerelő Orvos Facebook Skype Orvos Oktató Skype Szerelő EmailCím Diák Orvos
Polimorfizmus interfészekkel (3) szenasi.sandor@nik.uni-obuda.hu 16 NeptunFelhasználó Diák Oktató ITalálkozó <<interface>> Név() : Szöveg ÜzenetKüldés(Szöveg) Szolgáltató ITalálkozó Orvos Szerelő <<interface>> ITalálkozó Időpontkérés() : Idő Időpontfoglalás(Idő) címjegyzék : IEIérhető[ ] naptár : ITalálkozó[ ] ChatPartner Diák Oktató Szerelő Orvos Facebook Skype Orvos Oktató Skype Szerelő EmailCím Diák Orvos
17 Ő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 A kliens számára lényegtelen, hogy a megadott paraméterekhez a gyár milyen szabályok szerint hoz létre (ad vissza) egy konkrét objektumot Néhány példa Adatbázis meghajtók létrehozása Grafikus felület elemeinek létrehozása <<interface>> IFizetőEszköz Terhelés(Szám) Hitelkártya PayPal IFizetőEszköz IFizetőEszköz FizetőGyár Létrehoz(ID) : IFizetőEszköz
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 Forráskód elrejtése Stb. SzámlaModul <<interface>> IHitelkártyaEllenőrző Ellenőriz(Kártya) : Logikai KártyaModul
Polimorfizmus áttekintése Interfészek Interfészek alkalmazása Interfészek kiterjesztése Interfészek
20 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)
21 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 Ismét kiegészítve az eddigieket: 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, casztolás stb.)
22 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
23 Irodalomjegyzék Javasolt/felhasznált irodalom BMF NIK AAO, OOP, VEP előadások J. Richter: CLR via C# 2nd edition, Microsoft press, 2006