Java VII. Polimorfizmus a Java nyelvben

Hasonló dokumentumok
Java VII. Polimorfizmus a Java nyelvben

Virtuális függvények (late binding)

Java VI. Miskolci Egyetem Általános Informatikai Tanszék. Utolsó módosítás: Ficsor Lajos. Java VI.: Öröklődés JAVA6 / 1

OOP: Java 8.Gy: Abstract osztályok, interfészek

Java VI. Egy kis kitérő: az UML. Osztály diagram. Általános Informatikai Tanszék Utolsó módosítás:

Java programozási nyelv 5. rész Osztályok III.

Programozási nyelvek Java

és az instanceof operátor

Java VIII. Az interfacei. és az instanceof operátor. Az interfészről általában. Interfészek JAVA-ban. Krizsán Zoltán

C++ programozási nyelv

Java programozási nyelv 4. rész Osztályok II.

Osztálytervezés és implementációs ajánlások

Osztálytervezés és implementációs ajánlások

JAVA PROGRAMOZÁS 2.ELŐADÁS

Programozási nyelvek Java

Származtatási mechanizmus a C++ nyelvben

Programozás I. 5. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

OOP. Alapelvek Elek Tibor

Osztályok. 4. gyakorlat

Bevezetés a Programozásba II 8. előadás. Polimorfizmus Giachetta Roberto

Helyes-e az alábbi kódrészlet? int i = 1; i = i * 3 + 1; int j; j = i + 1; Nem. Igen. Hányféleképpen lehet Javaban megjegyzést írni?

OBJEKTUM ORIENTÁLT PROGRAMOZÁS JAVA NYELVEN. vizsgatételek

Statikus adattagok. Statikus adattag inicializálása. Speciális adattagok és tagfüggvények. Általános Informatikai Tanszék

JAVA PROGRAMOZÁS 3.ELŐADÁS

Objektum Orientált Programozás. 11. Kivételkezelés 44/1B IT MAN

Már megismert fogalmak áttekintése

Java III. I I. Osztálydefiníció (Bevezetés)

Az osztályok csomagokba vannak rendezve, minden csomag tetszőleges. Könyvtárhierarhiát fed: Pl.: java/util/scanner.java

List<String> l1 = new ArrayList<String>(); List<Object> l2 = l1; // error

Pelda öröklődésre: import java.io.*; import java.text.*; import java.util.*; import extra.*;

Interfészek. PPT 2007/2008 tavasz.

Java III. I I. Osztálydefiníció (Bevezetés)

Objektumorientált programozás C# nyelven

Objektumelvű alkalmazások fejlesztése 6. gyakorlat. Öröklődés, polimorfizmus. Öröklődés Kódismétlődés objektum-orientált szerkezetben

Abstract osztályok és interface-ek. 7-dik gyakorlat

Bevezetés a programozásba előadás: Öröklődés

Széchenyi István Egyetem. Programozás III. Varjasi Norbert

Alkalmazott Modul III 6. előadás. Objektumorientált programozás: öröklődés és polimorfizmus

Programozási technológia

JUnit. JUnit használata. IDE támogatás. Parancssori használat. Teszt készítése. Teszt készítése

Osztály és objektum fogalma

Programozás II. 3. gyakorlat Objektum Orientáltság C++-ban

Öröklés és Polimorfizmus

OOP #14 (referencia-elv)

Programozás II. 2. gyakorlat Áttérés C-ről C++-ra

Java IX. telkezelés a Java-ban

Programozási nyelvek II.: JAVA, 3. gyakorlat

Osztályok. construct () destruct() $b=new Book(); $b=null; unset ($b); book.php: <?php class Book { private $isbn; public $title;

Java V. Osztályszint. lyszintű ű tagok. Példányváltozó. Osztályváltozó. Általános Informatikai Tanszék Utolsó módosítás:

Programozás módszertan p.1/46

Programozási nyelvek II. JAVA EA+GY 1. gyakolat

Java bevezet o Kab odi L aszl o Kab odi L aszl o Java bevezet o

C++ programozási nyelv Konstruktorok-destruktorok

Bánsághi Anna 2014 Bánsághi Anna 1 of 33

Kivételkezelés, beágyazott osztályok. Nyolcadik gyakorlat

Objektumok inicializálása

Dr. Pál László, Sapientia EMTE, Csíkszereda WEB PROGRAMOZÁS 2.ELŐADÁS. Objektumorientált programozás

Java IX. telkezelés a Java-ban

Programozási technológia

Objektumorientált programozás C# nyelven

Osztály öröklődés. Öröklődés és polimorfizmus. Programozás II. előadás. Szénási Sándor.

C++ programozási nyelv

Programozás III KIINDULÁS. Különböző sportoló típusok vannak: futó, magasugró, focista, akik teljesítményét más-más módon határozzuk meg.

Alkalmazott modul: Programozás 11. előadás. Objektumorientált programozás: öröklődés

GENERIKUS PROGRAMOZÁS Osztálysablonok, Általános felépítésű függvények, Függvénynevek túlterhelése és. Függvénysablonok

Programozás. C++ osztályok. Fodor Attila. Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek Tanszék

Objektum orientált programozás Bevezetés

3. Osztályok II. Programozás II

Programozási nyelvek Java

Generikus osztályok, gyűjtemények és algoritmusok

Java és web programozás

Absztrakció. Objektum orientált programozás Bevezetés. Általános Informatikai Tanszék Utolsó módosítás:

Bevezetés a C++ programozási nyelvbe

Java programozási nyelv 6. rész Java a gyakorlatban

OOP és UML Áttekintés

Programozási nyelvek II.: JAVA, 11. gyakorlat

Mi a különbség az extends és az implements között. Mikor melyiket kell használni? Comperable-t megvalósító oasztályokban össze lehet hasonlitani

Java II. I A Java programozási nyelv alapelemei

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

Programozási nyelvek Java

OOP: Java 11.Gy: Enumok, beágyazott osztályok. 13/1 B ITv: MAN

Web-technológia PHP-vel

OOP: Java 7.Gy: Öröklődés, referenciák

Segédanyag: Java alkalmazások gyakorlat

Collections. Összetett adatstruktúrák

Objektumorientált szoftverfejlesztés alapjai

Programozási nyelvek Java

Visual C++ osztály készítése, adattagok, és metódusok, láthatóság, konstruktor, destruktor. Objektum létrehozása, használata, öröklés.

Objektum orientált kiterjesztés A+ programozási nyelvhez

1. Egyszerű (primitív) típusok. 2. Referencia típusok

C++ programozási nyelv

Interfészek. Programozás II. előadás. Szénási Sándor.

1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon

Programozási nyelvek II.: JAVA

Miután létrehoztuk, szeretnénk neki beszédesebb nevet adni. A név változtatásához a következőt kell tenni:

Java Programozás 5. Ea: OOP alapok. Abstract Javaságok

C# Nyelvi Elemei. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) C# Nyelvi Elemei / 18

Objektumorientált paradigma és programfejlesztés Bevezető

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

Segédanyag: Java alkalmazások gyakorlat

Átírás:

Java VII. Polimorfizmus a Java nyelvben Miskolci Egyetem Általános Informatikai Tanszék Utolsó módosítás: 2005. 10. 19. Java VII. Polimorfizmuss JAVA7 / 1 A kötés (binding( binding) ) fogalma Kötés (binding) fogalma: egy metódus híváshoz a megfelelő definíció megtalálása. Ehhez a metódusnév nem elég. Ha az aktuális objektum osztályában a név egyedi (beleértve az örökölt metódusokat is), a hatáskör és a név elegendő az azonosításhoz. Az objektum statikus típusa alapján az azonosítást a fordítóprogram el tudja végezni. Ez korai kötés (early binding). Nem polimorfizmus, mert a név egyedi. Java VII. Polimorfizmus JAVA7 / 2 A poliformizmus implementációi Metódusnév túlterhelés A már ismert mechanizmus: egy osztályon belül azonos nevű függvények, eltérő paraméter szignatúrával. A saját és az örökölt függvények együttesen tekintendők. Korai kötés: a fordítóprogram az aktuális paraméterek statikus típusa alapján dönteni tud. Polimorfizmus, mert a név nem egyedi, további információkat kell felhasználni. Java VII. Polimorfizmus JAVA7 / 3

A poliformizmus implementációi (folyt.) Metódus felüldefiniálás Az előzőnél még hatékonyabb implementációs forma. A leszármazott osztály az ős osztálytól örökölt metódust felüldefiniálhatja. Egy ilyen metódus hívásánál dönteni kell, hogy az örökölt vagy a saját változat hívódjon meg - polimorfizmus. A döntés alapja a hivatkozás dinamikus típusa. Mivel a dinamikus típus fordítási időben nem ismert, a felüldefiniált metódusok közötti választást futásidőre kell halasztani - késői kötés. Java VII. Polimorfizmus JAVA7 / 4 Metódus felüldefiniálás - alapszabályok Egy ős osztálybeli metódus felüldefiniálásához a következő feltételeknek kell teljesülnie: A felüldefiniáló metódus visszatérési típusának, nevének, és paraméter szignatúrájának meg kell egyeznie az ős osztálybeli metóduséval. A felüldefiniáló metódus hozzáférési kategóriája nem lehet szűkebb az eredeti metódusénál. (Bővebb lehet.) A felüldefiniáló metódus csak olyan ellenőrzött kivételeket válthat ki, amilyeneket az eredeti is kiválthat. (Pontos jelentése később.) Java VII. Polimorfizmus JAVA7 / 5 Felüldefiniált metódus hívása A hívásban szereplő valamennyi információ illik minden metódus változatra - ez alapján nem lehet dönteni. A döntés alapja a hivatkozás dinamikus típusa. A döntés csak futás időben történhet. A felüldefiniáló metódus az ős osztály metódusát elérheti a super.metódusnév(...) formájú hivatkozással. Java VII. Polimorfizmus JAVA7 / 6

zerű ű példa package jarmu3; public class jarmu { private int kerekek; private double suly; public jarmu(int k, double s) { kerekek = k; suly = s;} public int kerekszam () { return kerekek;} public double kerekterheles() {return suly / kerekek; }; public double sulya() {return suly;} } Java VII. Polimorfizmus JAVA7 / 7 zerű ű példa (folyt.) package jarmu3; public class gepkocsi extends jarmu { private int szemelyek; public gepkocsi(int k, double s, int szem){ super(k, s); szemelyek = szem; } public double kerekterheles() {return sulya() + szemelyek*80 / kerekszam(); } } Java VII. Polimorfizmus JAVA7 / 8 zerű ű példa (folyt.) package jarmu3; public class proba { public static void main (String[] args) { jarmu bicikli = new jarmu(2, 15.0); System.out.print ("Bicikli kerekterhelese: "); System.out.println (bicikli.kerekterheles()); Java VII. Polimorfizmus JAVA7 / 9

zerű ű példa (folyt.) Futás eredmény: Bicikli kerekterhelese: 7.5 A jarmu2 példához képest semmi változás Az ok, hogy a bicikli referencia statikus és dinamikus típusa azonos. Java VII. Polimorfizmus JAVA7 / 10 zerű ű példa (folyt.) jarmu trabant = new gepkocsi(4, 600.0, 4); System.out.print ("Trabant kerekterhelese: "); System.out.println (trabant.kerekterheles()); } // main vege } // class proba vege Java VII. Polimorfizmus JAVA7 / 11 zerű ű példa (folyt.) Futás eredmény: Trabant kerekterhelese: 680.0 A gepkocsi osztályban definiált kerekterheles metódus hívódik meg, a dinamikus típusnak megfelelően. Java VII. Polimorfizmus JAVA7 / 12

A késői kötés használata Az leszármaztatás lehetőséget teremt, hogy viselkedésformákat örököljön egy osztály. Bizonyos esetekben a változatlanul öröklődő viselkedés nem felel meg a leszármazottnak. A felüldefiniálás lehetősége ezt a problémát tudja megoldani. A késői kötés automatizmusa a használatot kényelmessé teszi. Java VII. Polimorfizmus JAVA7 / 13 Metódus felüldefiniálás - további szabályok Nem kötelező a leszármazás minden szintjén felüldefiniálni a metódust. Egy osztály örökölheti a felüldefiniált metódust. Statikus metódus nem definiálható felül. (Értelmetlen lenne, mert hívása a statikus típus alapján történik.) Ugyanolyan nevű statikus metódus a leszármazott osztályban elfedi az ős osztály metódusát. Java VII. Polimorfizmus JAVA7 / 14 Példa: grafikus editor Megvalósítandó egy grafikus editor. űsítések: síkbeli alakzatok, nincsenek színek. A rajzfelületen megjelenő egységek objektumok, mert vannak adatszerű tulajdonságai (hely, méretek stb.) vannak olyan műveletek, amelyek elvégezhetők rajtuk (transzformációk stb.). Az objektum orientált szemlélet hasznos. Java VII. Polimorfizmus JAVA7 / 15

Példa: tervezési döntések Minden objektum helyzetét egy referencia pontja, és ha szükséges, egyéb adatok (például szög) határozza meg. Az egyes síkidomok közös tulajdonságait megfigyelve egy öröklődési hierarchia építhető fel. A közös tulajdonságokat és viselkedés mintákat csak egyszer kell implementálni, a leszármazottak készen kapják. Java VII. Polimorfizmus JAVA7 / 16 Példa: tervezési döntések (folyt.) Minden objektumon elvégezhetők legyenek az alapvető geometriai transzformációk. Például eltolás, forgatás, átméretezés stb. A transzformációk végrehajtásáért maguk az objektumok legyenek felelősek. A megfelelő metódusok fogják végrehajtani. A transzformációs metódusok is öröklődhetnek => kód újrafelhasználás. Ezen döntések alapján az osztályterv egy első változata: Java VII. Polimorfizmus JAVA7 / 17 Példa: osztályterv (1. verzió) Location X : Integer Y : Integer GetX() : Integer GetY() : Integer Point Visible : Boolean MoveTo(NewX : Integer, NewY : Integer) IsVisible() : Boolean Figyelem! Terjedelmi okokból nem teljes. Első változat, azaz - felülvizsgálatra, - finomításra szorul. Circle Radius : Integer MoveTo(NewX : Integer, NewY : Integer) Expand(Ratio : Single) Square MoveTo(NewX : Integer, NewY : Integer) Expand(Ratio : Single) Ellipse Radius1 : Integer Java VII. Polimorfizmus JAVA7 / 18 MoveTo(NewX : Integer, NewY : Integer)

Példa: osztályterv finomítása Nézzük meg a MoveTo implementációit. Point: void MoveTo(int NewX, int NewY) { ; // aktuális törlése X = NewX; // új pozíció Y = NewY; ; // megjelenítés az új helyen } Java VII. Polimorfizmus JAVA7 / 19 Példa: osztályterv finomítása (folyt.) Circle: void MoveTo(int NewX, int NewY) { ; // aktuális törlése X = NewX; // új pozíció Y = NewY; ; // megjelenítés az új helyen } A két implementáció azonosnak tűnik, mert azonos az algoritmus: törlés az aktuális pozícióban, referencia pont módosítása, megjelenítés. Java VII. Polimorfizmus JAVA7 / 20 Példa: osztályterv finomítása (folyt.) A különbség: a Point osztály MoveTo metódusában a Point -ja hívódik meg a Circle osztály MoveTo metódusában a Circle -ja hívódik meg Az algoritmus bármilyen alakzatra ugyanaz. Kérdés: örökölhető-e a MoveTo, vagy külön implementáció szükséges minden osztályra? Java VII. Polimorfizmus JAVA7 / 21

Példa: osztályterv finomítása (folyt.) A válasz: örökölhető! A magyarázat: AMoveTo metódus a this.show és this.hide metódusokat hívja meg. A Show és és Hide metódust minden osztály felüldefiniálja (hiszen működésük az alakzattól függ). Athis pszeudóváltozó dinamikus típusa (amellyel a MoveTo-t használtuk) dönt a felüldefiniált Show és Hide metódusok között. Java VII. Polimorfizmus JAVA7 / 22 Példa: finomított osztályterv Location Visible : Boolean X : Integer Y : Integer GetX() : Integer GetY() : Integer Point MoveTo(NewX : Integer, NewY : Integer) IsVisible() : Boolean Figyelem! Terjedelmi okokból nem teljes. Második változat, azaz jobb, de még lehet javítani. Circle Radius : Integer Expand(Ratio : Single) Square Expand(Ratio : Single) Ellipse Radius1 : Integer Java VII. Polimorfizmus JAVA7 / 23 Példa: további implementációs részletek Létrehozott rajzelemek tárolása: final int MAXELEM=1000; int aktelemszam = 0; Location elemek[]; elemek = new Location[MAXELEM]; // Uj rajzelem letrehozasa aktelemszam++; elemek[aktelemszam] = new Java VII. Polimorfizmus JAVA7 / 24

Példa: további implementációs részletek // Osszes elem ujrarajzolasa for (int i=0; i<aktelemszam; i++) elemek[i].; Megjegyzés: Természetesen a rajzelemek tömbben való tárolása ügyetlen (elegánsabban szólva naív) megoldás. A helyes megoldás egy dinamikusabb adatszerkezet (például lista) alkalmazása lenne. Java VII. Polimorfizmus JAVA7 / 25 final metódus Egy metódus kaphat final minősítőt. Afinal minősítésű metódust nem definiálhatja felül egyetlen leszármazott osztály sem. Szerepe, hogy megakadályozza bizonyos viselkedés formák megváltoztatását, ha az veszélyezteti a helyes működést. Java VII. Polimorfizmus JAVA7 / 26 Absztrakt metódus és osztály Gyakran előfordul a tervezés során, hogy egy osztály szintjén tudjuk, hogy valamilyen metódus szükséges lesz a leszármazottakban, de még nem lehet megadni az implementációját. Ezért a Java nyelv megengedi törzs nélküli metódus definiálását. Az ilyen metódust az abstract minósítővel kell ellátni. Ha az osztály tartalmaz absztrakt metódust, az osztályt is az abstract minősítővel kell ellátni. Java VII. Polimorfizmus JAVA7 / 27

Absztrakt metódus és osztály (folyt.) Répási tanár úr kedvenc példáját idézve: public abstract class Sikidom { public abstract double terulet(); public abstract double kerulet(); } A fenti osztálydefiníció az alábbi tervezési meggondolásokat fejezi ki: minden síkidomnak van területe és kerülete, nincs algoritmus a terület és kerület számítására a síkidom tulajdonságainak ismerete nélkül. Java VII. Polimorfizmus JAVA7 / 28 Absztrakt metódus és osztály (folyt.) Formai szabályok: Absztrakt egy metódus, ha nincs törzse. Megvalósítást (törzset), majd csak a felüldefiniálás során kap. Absztrakt metódusnak nem lehet módosítója a private, final, static hiszen az ilyen metódusokat nem lehet felüldefiniálni. Absztrakt egy osztály, ha van legalább egy absztrakt metódusa. Java VII. Polimorfizmus JAVA7 / 29 Absztrakt metódus és osztály (folyt.) Absztrakt osztályt nem lehet példányosítani. Egy absztrakt osztály arra szolgál, hogy ős osztálya legyen további osztályoknak. A leszármazott osztály(ok) feladata az absztrakt metódusok felüldefiniálása. Absztrakt osztály gyermeke lehet absztrakt, ha nem minden absztrakt metódust valósít meg. Az absztrakt osztály is használható referencia statikus típusaként. Java VII. Polimorfizmus JAVA7 / 30

Absztrakt metódus és osztály (folyt.) Az absztrakt metódusok szerepe: Rögzít egy tervezési döntést (szükséges metódusok halmaza). Kényszeríti a leszármazott osztály(ok) programozóját meghatározott metódusok definiálására. Java VII. Polimorfizmus JAVA7 / 31 Absztrakt metódus és osztály (folyt.) Hibalehetőségek: Törzs nélküli metódus, abstract minősítő nélkül. Absztrakt metódust tartalmazó osztály abstract minősítő nélkül. A fordítóprogram figyeli az ilyen hibákat. Java VII. Polimorfizmus JAVA7 / 32