Programozás módszertan Örökl˝odés Pere László (
[email protected]) P ÉCSI T UDOMÁNYEGYETEM T ERMÉSZETTUDOMÁNYI K AR I NFORMATIKA ÉS Á LTALÁNOS T ECHNIKA TANSZÉK M AGYAR T UDOMÁNYOS A KADÉMIA S ZÁMÍTÁSTECHNIKAI ÉS AUTOMATIZÁLÁSI K UTATÓINTÉZET E L EARNING O SZTÁLY
Programozás módszertan – p.1/46
Bevezetés
Programozás módszertan – p.2/46
Általános vs. speciális Az absztrakció folyamatára nem csak az absztrakt tárgyak (pl. asztal) létrehozása, hanem a köztük megfigyelhet˝o viszonyok feltérképezése is jellemz˝o (pl. tárgy, bútor, asztal, íróasztal és tárgy, járm˝u, személygépkocsi). Az absztrakció során egy hierarchiát hozunk létre az absztrakt tárgyakból. A hierarchikus rendszerben az általánostól a speciálisig haladva az egyes absztrakt tárgyak rendelkeznek az elo˝ z˝o tárgy összes tulajdonságaival, azokat b˝ovítik, finomítják, specializálják.
Programozás módszertan – p.3/46
Örökl˝odés Az objektumorientált módszertan az absztrakt tárgyak modellezésére az osztályokat használja. Az absztrakció során az absztrakt tárgyakból létrehozott hierarchiát az objektumorientált programozás során az osztályok közt létrehozott hierarchiával modellezhetjük. Az osztályok közt létrehozott hierarchiában az általánostól a speciálisig haladunk, a rákövetkez˝o osztály örökli az el˝oz˝o osztály adattagjait és metódusait.
Programozás módszertan – p.4/46
Ismétlés Objektum alapú nyelvek: támogatják az objektumok létrehozását, de nem ismerik az osztály fogalmát. Osztály alapú nyelvek: támogatják az osztályok létrehozását, de a köztük lév˝o viszonyokat nem ábrázolják. Objektumorientált nyelvek: támogatják az osztályok közti viszonyok ábrázolását az örökl˝odés eszközével. Csak azokat a nyelveket nevezhetjük objektumorientált nyelveknek, amelyek az osztályok közti viszonyokat az örökl˝odés eszközével képesek kezelni!
Programozás módszertan – p.5/46
Elnevezések Az osztály létrehozásakor meghatározhatjuk, hogy mely létez˝o osztály (vagy osztályok) tulajdonságait örökölje az új osztály. Az örökl˝o osztályt örökösnek, az öröklött tulajdonságokat hordozó osztályt szül˝onek vagy o˝ snek nevezzük. A szül˝o mindazon osztályok o˝ sszül˝oje, amelyeknek az örökös a szül˝oje vagy o˝ sszül˝oje. Az osztály az összes o˝ sszül˝ojének leszármazottja.
Programozás módszertan – p.6/46
Polimorfizmus Polimorfizmus (többalakúság): az objektumorientált programozási nyelvek típusrendszere úgy van kialakítva, hogy mindazon helyeken, ahol a szül˝o vagy az o˝ sszül˝o szerepelhet, szerepelhet az örökös is. Példa: Ha egy függvény képes az állat osztályba tartozó objektumot kezelni, képes a leszármazottként létrehozott eml˝os és méhlepényes eml˝os osztály objektumait is kezelni. A polimorfizmus az ellenkez˝o irányban nem érvényes!
Programozás módszertan – p.7/46
Specializáció Az örökl˝odés során az általánostól a speciális irányába haladunk. Ezt a legtöbbször úgy tesszük, hogy a szül˝o osztályt új attribútumokkal (adattag, metódus) b˝ovítjük. Példa: Az ember osztályt az alkalmazott osztályban a fizetéssel és a munkakörrel, az üzletfél osztályban az eddigi vásárlások összértékével b˝ovítjük. Az attribútumok b˝ovítése a típusértékhalmaz sz˝ukítésével jár.
Programozás módszertan – p.8/46
Specializáció A specializációt támogatandó általában leheto˝ ségünk van arra is, hogy az o˝ sosztály valamely attribútumát (adattagját vagy metódusát) megváltoztassuk, újradefiniáljuk. Példa: A síkidom osztályban a kirajzolást végzo˝ metódus általános eszköz, a leszármazott téglalap osztály kirajzolását végz˝o metódusa azonban már lehet egy hatékonyabb algoritmust használó speciális eszköz.
Programozás módszertan – p.9/46
Dinamikus összekapcsolás A dinamikus összekapcsolás eszköze ad lehet˝oséget arra, hogy az objektumot aktuális típusa szerint valamelyik o˝ sszül˝o vagy a saját attribútumaival kezeljük. Példa: Ha a téglalap osztály objektumát a síkidom osztály objektumaként használjuk (polimorfizmus), akkor a téglalap osztály objektumát a síkidom osztály attribútumaival jellemezzük és kezeljük vagy a téglalap osztály attribútumaival.
Programozás módszertan – p.10/46
Többszörös örökl˝odés Bizonyos objektumorientált programozási nyelvek megengedik, hogy az osztálynak egyszerre több szül˝oje, közvetlen o˝ sosztálya legyen. Ilyen esetben az osztály minden szül˝ojének attribútumait örökli. A többszörös örökl˝odés kezelése problémákat vet fel, ha például ugyanazon a néven több szül˝ot˝ol örököl az osztály attribútumot. A többszörös örökl˝odés igen hatékony, nagy kifejez˝oerej˝u eszköz lehet, használata azonban nem egyszer˝u!
Programozás módszertan – p.11/46
Örökl˝odés a különféle nyelvekben
Programozás módszertan – p.12/46
SIMULA 67 A SIMULA 67 volt az els˝o programozási nyelv, amely támogatta az örökl˝odést, azaz a SIMULA 67 volt az els˝o objektumorientált nyelv. A nyelv nem támogatja a többszörös örökl˝odést, minden osztálynak csak egy közvetlen o˝ sosztálya lehet!
Programozás módszertan – p.13/46
Smalltalk A Smalltalk támogatja az örökl˝odést, így a Smalltalk is objektumorientált nyelvnek tekinthet˝o.
Programozás módszertan – p.14/46
C++ A C++ nyelv támogatja az örökl˝odést, így objektumorientált nyelvnek tekinthet˝o. A C++ nyelvben megengedett a többszörös örökl˝odés, egy osztálynak több közvetlen o˝ sosztálya is lehet.
Programozás módszertan – p.15/46
Object Pascal Az Object Pascal támogatja az örökl˝odést az osztályok közt. A nyelv csak olyan osztályok közt teszi lehet˝ové a többszörös örökl˝odést, amelyek: nem rendelkeznek egyetlen adattaggal sem a bennük definiált metódusoknak nincsen törzsük. Az ilyen osztályokat interfészeknek hívjuk.
Programozás módszertan – p.16/46
Eiffel Az Eiffel programozási nyelv támogatja az öröklo˝ dést és a többszörös örökl˝odést is. A nyelvet használva a leszármazott osztályban csak azokat az attribútumokat definiálhatjuk újra, amelyeket az o˝ sökben újradefiniálhatóként hoztunk létre.
Programozás módszertan – p.17/46
Java A Java nyelv támogatja az örökl˝odést, de a többszörös örökl˝odést csak az Object Pascal nyelvnél megfigyelheto˝ esetekben teszi lehet˝ové. A Java nyelvben az osztály létrehozásakor megtilthatjuk, hogy az osztálynak örököse legyen.
Programozás módszertan – p.18/46
C# A C# nyelvben az örökl˝odés a szerz˝ok szerint a C++ nyelvhez hasonlóan történik, valójában azonban jobban hasonlít a Java öröklési rendszerére. A C# a többszörös örökl˝odést csak a Java nyelvhez hasonló különleges esetekben teszi lehet˝ové. A C# nyelvben az osztály létrehozásakor megtilthatjuk a leszármazott létrehozását.
Programozás módszertan – p.19/46
Öröklési módok, adatrejtés
Programozás módszertan – p.20/46
Adatrejtés és örökl˝odés A public és a private adatrejtési módokon kívül sok nyelvben létezik a protected (védett) adatrejtési mód is. A protected adatrejtéssel létrehozott attibútumok a leszármazottban public-ként, másutt pedig private-ként viselkedik. kívül objektum leszármazott public igen igen igen protected nem igen igen private nem igen nem Figyeljük meg, hogy a leszármazott a private attribútumokat rejtett módon örökli!
Programozás módszertan – p.21/46
Öröklési módok Néhány programozási nyelv megengedi, hogy az el˝obbiekben bemutatott adatrejtési rendszert felülbíráljuk, azaz megváltoztassuk a öröklés hatását az adatrejtésre. Az ilyen nyelvekben felülbírálhatjuk az o˝ s adatrejtési rendszerét, ezzel például megoldva a többszörös örökl˝odés problémáit. A C++ nyelv például három öröklési módot képes kezelni.
Programozás módszertan – p.22/46
Öröklési módok A C++ nyelvben három öröklési mód létezik: public Megtartja az o˝ sök láthatósági szintjeit. private Minden örökölt attribútum rejtetté válik. protected Minden örökölt attribútum védett lesz. Bármelyik öröklési módot válasszuk, az o˝ sben rejtettként definiált attribútumok a leszármazottban közvetlenül nem lesznek elérhet˝ok. Az alapértelmezett öröklési mód a private.
Programozás módszertan – p.23/46
C++ örökl˝odés o˝ s private protected public private protected public private protected public
örökl˝odés public public public private private private protected protected protected
leszármazott közvetlenül nem elérhet˝o protected public közvetlenül nem elérhet˝o private private közvetlenül nem elérhet˝o protected protected
Programozás módszertan – p.24/46
Polimorfizmus és dinamikus kötés
Programozás módszertan – p.25/46
Helyettesíthet˝oség A leszármaztatott osztály objektumai bármilyen körülmények között helyettesíthetik az o˝ sosztály objektumait. A helyettesíthet˝oséget többalakúságnak (polimorfizmus) is nevezzük. Meg kell jegyeznünk, hogy a polimorfizmus csak egy szemantikai eszköz, amelyet ki kell tudnunk használni. Az osztályokat úgy kell létrehoznunk, hogy a leszármaztatott osztály objektumai valóban helyettesíthessék az o˝ sosztály objektumait.
Programozás módszertan – p.26/46
Típusellen˝orzés Fontos kérdés, hogy az adott nyelv hogyan kezeli a többalakúságot, milyen módon képes a típusrendszer ellen˝orizni a típusokat. Probléma: Legyen a Tárgy osztály leszármazottja a Járm˝u, valamint legyenek a tárgy és a járm˝u változók a megfelel˝o típusú objektumok. Akkor nyilván megengedett a tárgy = járm˝ u értékadás, de milyen típusa lesz ezek után a tárgy változónak?
Programozás módszertan – p.27/46
Típusellen˝orzés nélkül A dilemma egyik megoldása lehet, hogy kikapcsoljuk a típusellen˝orzést és tetsz˝oleges értékadást megengedünk (pl. Smalltalk). Ilyen esetben a típusrendszer hibakeres˝o szolgáltatásairól lemondunk, a programozónak kell a típusok karbantartásáról gondoskodnia. Ez nyilván egyszer˝u, de szerencsétlen megoldás.
Programozás módszertan – p.28/46
Statikus/dinamikus típus Másik megoldást jelenthet a statikus és dinamikus típus megkülönböztetése. A statikus típus a változó azon típusa, amelyet a deklarációban megadtunk. A statikus típus fordítási id˝oben ismert, ellen˝orizhet˝o. A dinamikus típus a változó által az adott pillanatban hordozott adat típusa. A dinamikus típus megállapítására és ellen˝orzésére csak futási id˝oben van mód.
Programozás módszertan – p.29/46
Dinamikus kötés Az örökl˝odés során lehet˝ové tesszük, hogy az egyes leszármazottnál a metódusok implementációja és/vagy specifikációja különbözzön. Kérdés, hogy a polimorfizmus kihasználása esetén melyik metódust használjuk: az o˝ s, vagy a leszármazott metódusát használjuk az o˝ snek megfelel˝o statikus és a leszármazottnak megfelel˝o dinamikus típusú változó esetében? A dinamikus összekapcsolás lehet˝ové teszi, hogy a változó dinamikus típusa alapján meghatározott implementációt használjuk.
Programozás módszertan – p.30/46
Dinamikus kötés A dinamikus kötés futási id˝oben történik, vagyis futási id˝oben derül ki pontosan melyik metódus hajtódjon végre. A legtöbb programozási nyelvben a dinamikusan kapcsolódó alprogramot virtuális alprogramnak (virtuális m˝uvelet, virtuális függvény) nevezzük.
Programozás módszertan – p.31/46
Statikus/dinamikus kötés Számos programozási nyelv a statikus kötést (a meghívandó metódusok fordítási id˝oben ismertek, statikus típustól függenek) és a dinamikus kötést is támogatják. Az ilyen nyelvek esetében a programozó határozhatja meg, hogy statikus vagy dinamikus kötést használ az adott esetben. Általában azoknál a programozási nyelveknél, amelyeket eredetileg is objektumorientált nyelvként terveztek, a dinamikus kötés az alapértelmezett.
Programozás módszertan – p.32/46
C++ A C++ nyelv esetében a dinamikus kötésre a virtual kulcsszó segítségével van módunk. A C++ nyelvben tehát a statikus kötés az alapértelmezett. Az o˝ sosztálybeli objektumok értékül felvehetik a leszármazott objektumokat, de ha nem pointereket vagy referenciákat használunk, a virtuális metódusok is statikus kötéssel kapcsolódnak.
Programozás módszertan – p.33/46
C++ A leszármazott a metódusok csak korlátozott formában definiálhatja újra: A metódusok paraméterlistája meg kell, hogy egyezzen az o˝ sben és a leszármazottban. A leszármazott metódusának visszatérési értéke az o˝ s metódusának visszatérési értékével megegyezo˝ vagy az o˝ s metódus visszatérési értékének leszármazottja kell, hogy legyen. Ha ezeket a szabályokat nem tartjuk be, a leszármazott metódusa az o˝ s metódusának túlterhelése lesz, nem pedig virtuális függvény.
Programozás módszertan – p.34/46
Object Pascal Az Object Pascalban a metódusok referenciáira érvényes a polimorfizmus. A nyelvben a statikus kötés az alapértelmezett, dinamikus kötést a virtual kulcsszóval valósíthatunk meg.
Programozás módszertan – p.35/46
Java A Java nyelvben minden változó objektumok referenciája, így az objektumorientált programozás támogatása sokkal jellemz˝obb az el˝oz˝o két nyelvnél. A polimorfizmus és a dinamikus kötés az alapértelmezett viselkedés.
Programozás módszertan – p.36/46
C# A C# programozási nyelvben az objektumokat referenciákon keresztül használjuk. A nyelv támogatja a statikus és a dinamikus összekapcsolást is, a dinamikus összekapcsoláshoz a virtual kulcsszó használata szükséges.
Programozás módszertan – p.37/46
Az o˝ s metódusai A programozás során szükségünk lehet arra, hogy az o˝ sosztály metódusait hívjuk. A leszármaztatott osztály metódusaiban például építhetünk az o˝ sosztály hasonló szerepet betölt˝o metódusaira tovább finomítva, specializálva azok eredményeit. Hogyan készítsünk szenes bablevest? Készítsünk egy bablevest és helyezzünk el benne némi brikettet. . .
Programozás módszertan – p.38/46
Az o˝ s metódusai Azoknál a programozási nyelveknél, ahol a leszármazottnak csak egyetlen o˝ se lehet (egyszeres örökl˝odés) általában elegend˝o egy kulcsszóval jelezni, hogy az o˝ s metódusát szeretnénk meghívni. A többszörös örökl˝odést is támogató nyelvek esetében általában valamelyik o˝ s nevével min˝osítjük a metódushívást.
Programozás módszertan – p.39/46
Új metódusok A leszármazott osztályban a specializáció során új metódusokat vezethetünk be. Kérdés, hogy a o˝ stípusnak megfelel˝o statikus típusú, a leszármaztatottnak megfelel˝o dinamikus típusú objektum esetén megengedhetjük-e azoknak a metódusoknak a hívását, amelyek az o˝ sben nem, csak a leszármazottban vannak jelen?
Programozás módszertan – p.40/46
Új metódusok A programozási nyelvek jelent˝os hányada (a C++ is), a hívható metódusok listáját a változó statikus típusa alapján határozza meg, vagyis nem hívhatók olyan metódusok, amelyek csak a dinamikus típusban meghatározott osztályban léteznek. Ez egyszer˝uen biztonságosabb így.
Programozás módszertan – p.41/46
Absztrakt osztályok
Programozás módszertan – p.42/46
Absztrakt osztályok A polimorfizmus és dinamikus kötés segítségével lehet˝oségünk nyílik arra, hogy olyan o˝ sosztályokat hozzunk létre, amelyekben még nem döntünk a konkrét megvalósításról. Az ilyen osztályokat absztrakt osztályoknak nevezzük. Az absztrakt osztályok absztrakt metódusokat tartalmaznak, amelyeknek nincsen törzsük, csak a leszármazottakban implementáljuk o˝ ket.
Programozás módszertan – p.43/46
Absztrakt osztályok Az absztrakt osztályokból általában nem készíthetünk objektumokat, azokat csak a leszármazottaikon keresztül használhatók. Az absztrakt osztályoknak általában lehetnek absztrakt leszármazottaik is, így az implementációt fokozatosan végezhetjük el. Absztrakt osztályokat általában nagyobb szoftverprojekt, mély öröklési hierarchia esetén használunk.
Programozás módszertan – p.44/46
Ajánlott irodalom
Programozás módszertan – p.45/46
Ajánlott irodalom [2] N YÉKYNÉ G AIZLER J UDIT (szerk.): Programozási nyelvek, Kiskapu (2003), ISBN: 963 9301 46 9.
Programozás módszertan – p.46/46