Interfészek
Programozás II. előadás http://nik.uni-obuda.hu/prog2 Szénási Sándor
[email protected]
Óbudai Egyetem,Neumann János Informatikai Kar
Interfészek Polimorfizmus áttekintése Interfészek Interfészek alkalmazása Interfészek kiterjesztése
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
[email protected]
Programozás II.
3
Interfészek Polimorfizmus áttekintése Interfészek Interfészek alkalmazása Interfészek kiterjesztése
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
[email protected]
Programozás II.
5
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 <
> IÖsszehasonlítható
IÖsszehasonlítható
érték: Szám
Egyenlő() Több() Kevesebb() [email protected]
Szám Egyenlő() Több() Kevesebb()
Programozás II.
6
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
[email protected]
Programozás II.
7
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
[email protected]
Programozás II.
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 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.)
[email protected]
Programozás II.
9
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 [email protected]
Programozás II.
10
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 [email protected]
Programozás II.
11
Interfészek Polimorfizmus áttekintése Interfészek Interfészek alkalmazása Interfészek kiterjesztése
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 <> – Interfész definiálása IÖsszehasonlítható • IÖsszehasonlítható interfész Kisebb(Objektum) : Logikai • 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
[email protected]
Programozás II.
13
Polimorfizmus interfészekkel
Diák
<> IElérhető
IElérhető
NeptunFelhasználó
Név() : Szöveg ÜzenetKüldés(Szöveg)
Oktató
Szolgáltató
IElérhető
Szerelő
Orvos
címjegyzék : IEIérhető[ ]
ChatPartner
Diák
IElérhető
Szerelő
Facebook
Orvos
Skype
Skype
EmailCím
[email protected]
IElérhető
Diák
Programozás II.
14
Polimorfizmus interfészekkel (2)
Diák
Oktató
Szolgáltató
<> IElérhető
IElérhető
NeptunFelhasználó
Név() : Szöveg ÜzenetKüldés(Szöveg)
ITalálkozó
<> ITalálkozó
IElérhető ITalálkozó
Időpontkérés() : Idő Időpontfoglalás(Idő)
Szerelő
Orvos
címjegyzék : IEIérhető[ ]
ChatPartner Facebook
EmailCím
[email protected]
IElérhető
Skype IElérhető
Programozás II.
naptár : ITalálkozó[ ]
Diák
Oktató
Szerelő
Orvos
Orvos
Oktató
Skype
Szerelő
Diák
Orvos
15
Polimorfizmus interfészekkel (3)
Diák
Oktató
Szolgáltató
<> IElérhető
IElérhető
NeptunFelhasználó
Név() : Szöveg ÜzenetKüldés(Szöveg)
ITalálkozó
<> ITalálkozó
IElérhető ITalálkozó
Időpontkérés() : Idő Időpontfoglalás(Idő)
Szerelő
Orvos
címjegyzék : IEIérhető[ ]
ChatPartner Facebook
EmailCím
[email protected]
IElérhető
Skype IElérhető
Programozás II.
naptár : ITalálkozó[ ]
Diák
Oktató
Szerelő
Orvos
Orvos
Oktató
Skype
Szerelő
Diák
Orvos
16
Ő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 <> IFizetőEszköz Terhelés(Szám)
[email protected]
Hitelkártya
IFizetőEszköz
FizetőGyár
PayPal
IFizetőEszköz
Létrehoz(ID) : IFizetőEszköz
Programozás II.
17
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
[email protected]
<> IHitelkártyaEllenőrző Ellenőriz(Kártya) : Logikai
Programozás II.
KártyaModul
Interfészek Polimorfizmus áttekintése Interfészek Interfészek alkalmazása Interfészek kiterjesztése
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)
[email protected]
Programozás II.
20
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.)
[email protected]
Programozás II.
21
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
[email protected]
Programozás II.
22
Irodalomjegyzék • Javasolt/felhasznált irodalom – BMF NIK – AAO, OOP, VEP előadások – J. Richter: CLR via C# 2nd edition, Microsoft press, 2006
[email protected]
Programozás II.
23