Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

Programozás III OOP ÖRÖKLŐDÉS, INTERFÉSZ. Objektumok: egy egységben az adatok és a rajtuk végzett műveletek. (Egyszerre a modularitás és a struktúra elemei.)

Hasonló előadás


Az előadások a következő témára: "Programozás III OOP ÖRÖKLŐDÉS, INTERFÉSZ. Objektumok: egy egységben az adatok és a rajtuk végzett műveletek. (Egyszerre a modularitás és a struktúra elemei.)"— Előadás másolata:

1 Programozás III OOP ÖRÖKLŐDÉS, INTERFÉSZ

2 Objektumok: egy egységben az adatok és a rajtuk végzett műveletek. (Egyszerre a modularitás és a struktúra elemei.) OBJEKTUM-ORIENTÁLT PARADIGMA – ISMÉTLÉS Az osztályokban megadjuk azokat a tulajdonságokat és viselkedéseket, amelyekkel az ebbe az osztályba tartozó objektumokat jellemezni akarjuk.  A hasonló tulajdonságokkal és viselkedéssel rendelkező objektumok egy osztályba kerülnek. Osztály (class): Olyan objektumminta vagy típus, mely alapján példányokat (objektumokat) hozhatunk létre. Minden objektum egy jól meghatározott osztályhoz tartozik.

3 Változók: osztályváltozó (static) – példányváltozó Metódusok: osztálymetódus (static) – példánymetódus Osztálymetódusnak nevezzük az olyan metódust, amely objektumok nélkül is tud dolgozni. Az osztálymetódus a példányadatokat nem éri el, csak az osztályváltozókat manipulálhatja. Egy osztálymetódus az osztályok közötti üzenettel hívható: Osztály.osztályMetódus OBJEKTUM-ORIENTÁLT PARADIGMA – ISMÉTLÉS

4 Az osztály, osztálystruktúra ábrázolása: UML diagram programkód Az UML egy szabványos, egységesített modellezőnyelv, amelynek segítségével a fejlesztési modellek rendkívül jól szemléltethetőek; a tervezés, a specifikáció, a dokumentálás grafikus formában, beszédes ábrák, diagramok, táblázatok segítségével végezhető. OBJEKTUM-ORIENTÁLT PARADIGMA – ISMÉTLÉS A programtervezés egyik segítő eszköze az UML (Unified Modeling Language)

5 UML – OSZTÁLYDIAGRAMOK

6 Fej: class OsztályNév Pl.: public class Elso Törzs Változók deklarálása Metódusok deklarálása JAVA KÓD – OSZTÁLYDEFINÍCIÓ Egy osztály módosítói lehetnek: public: az osztály nyilvánosan hozzáférhető abstract : az osztály nem példányosítható final: nem lehet őse más osztálynak

7 Egy változó módosítói lehetnek: Hozzáférési módosítók: nincs : csomagszintű hozzáférés public : nyilvánosan hozzáférhető private : csak az osztályon belül érhető el protected : az osztályból és az utódokból érhető el Egyéb módosítók: static : osztályváltozót jelez final : konstans, a változó értéke nem változhat JAVA KÓD – OSZTÁLYDEFINÍCIÓ Egy metódus módosítói lehetnek: ugyanezek + egyéb módosítóként: abstract : a metódusnak nincs törzse

8 UML – OSZTÁLYDIAGRAMOK Jelölések: + public - private # protected static FINAL abstract

9 Objektumok létrehozása: JAVA KÓD – OSZTÁLYDEFINÍCIÓ OsztályNév objektum; objektum = new OsztályNév(paraméterlista); vagy: OsztályNév objektum = new OsztályNév(paramlista); a new operátor segítségével: (A new operátor hatására a rendszer lefoglal egy tárterületet az objektum számára.)

10 Kitérő (ismétlés – típusok): JAVA KÓD – OSZTÁLYDEFINÍCIÓ Egyszerű típus: azonosítójával közvetlenül hivatkozunk a változó memóriahelyére. Ezt a helyet a rendszer a deklaráló utasítás végrehajtásakor foglalja le. Referencia típus: A referencia típusú változók objektumokra mutatnak. Egy referencia típusú változó azonosítójával közvetve hivatkozunk az objektum memóriahelyére. (Maga a hivatkozás rejtve marad.) Deklaráláskor csak a referencia részére foglalunk tárterületet, maga az objektum a példányosítás során jön létre.

11 Mi „hozza létre” az objektumot? JAVA KÓD – OSZTÁLYDEFINÍCIÓ Segítségével beállíthatjuk a változók kezdeti értékeit és elvégezhetünk olyan műveleteket, amelyeknek az objektum születésekor automatikusan kell végrehajtódniuk. A konstruktor. Definiálása: public Osztálynév(paraméterlista) { // inicializálás } Egy osztálynak több konstruktora is lehet. this objektumreferencia: az aktuális objektumra mutató referencia pl.: this.nev;

12 helyett: szemétgyűjtés Mi „szünteti meg” az objektumot?A destruktor Szemétgyűjtés (garbage collection): Felszabadítja a memóriát, de pontosan nem lehet tudni, hogy mikor. Dinamikus tárkezelés. Azokat az objektumokat tünteti el, amelyeket már senki sem használ. JAVA KÓD – OBJEKTUM MEGSZÜNTETÉSE

13 Metódus elérése: Mező (adattag) elérése: pont operátorral set/get metódussal Pl.: Ember egyik=new Ember(); egyik.alszik(); System.out.println(egyik.getNev()); egyik.setHajSzin(”barna”); JAVA KÓD – OBJEKTUMELÉRÉS

14 A múltkori diák-feladat: jó-e a konstruktor?: OBJEKTUM-ORIENTÁLT PARADIGMA – 1. PÉLDA (És nem this-zel, hanem osztálynévvel hivatkozunk rá.) Statikus változó nem lehet konstruktor paramétere! 

15 KONSTRUKTOROK És ha megengedett mindkét példányosítás? (Azaz opcionális, hogy az elején beállítunk-e átlagot vagy sem.) Egymásba csúszó konstruktorok tervezési minta:

16 Néha fordítva is szokás: OBJEKTUM-ORIENTÁLT PARADIGMA – 1. PÉLDA Adattag csak akkor lehet publikus, ha static final!!!

17 A metódus: vagy: melyik a jó? OBJEKTUM-ORIENTÁLT PARADIGMA – PÉLDA

18 Melyik a jó metódus: vagy: KITÉRŐ – MÁSIK PÉLDA Elvileg lehet-e jó a második változat? public static double terulet(…) Hogyan kellene kijavítani, hogy tényleg jó is legyen?

19 Hol használjuk fel a Diak típusú objektumokat? Egy másik osztályban: itt példányosítjuk őket, és itt állítjuk be a szükséges értékeket. Pl.: OBJEKTUM-ORIENTÁLT PARADIGMA – PÉLDA Hány konstruktora van a Diak osztálynak? Van-e automatikus (default) konstruktora? Mi a hiba? Beégetés!! 

20 JAVA OSZTÁLYOK Jó és rövid ( ) leírás: Auth Gábor (volt pollackos ): Java-Forum/Java-suli: show/java_osztalyok

21 Lehetséges felhasználások: OBJEKTUM-ORIENTÁLT PARADIGMA – 1. PÉLDA Hol lehet ez a kódrészlet?

22 Lehetséges felhasználások: OBJEKTUM-ORIENTÁLT PARADIGMA – 1. PÉLDA

23 Nincs még hibakezelés és csak egyszavas adatokra működik. Több szavas névhasználathoz be kellene állítani a scannert:

24 Lehetséges felhasználások: OBJEKTUM-ORIENTÁLT PARADIGMA – 1. PÉLDA

25 Az italokat jellemzi az ital fajtája, vonalkódja, mennyisége, literenkénti egységára, és a tényleges eladási ár, amely már az ÁFA értékét is tartalmazza. OBJEKTUM-ORIENTÁLT PARADIGMA – 2. PÉLDA Mezők: italFajta, vonalKod, mennyiseg, egysegAr, afaKulcs Metódusok: int ar(), String toString(), get/set A konstruktor paraméterei: italFajta, vonalKod, mennyiseg, egysegAr

26 Hogy lehet megoldani, hogy ne a „vendégnek” kelljen megadnia az ital egységárát? OBJEKTUM-ORIENTÁLT PARADIGMA – 2. PÉLDA „Normalizálni” kell Két osztály: Az Ital osztály konstruktora: Ar osztály– ennek konstruktora:

27 Ekkor rendeléskor ellenőrizni kell, hogy a kért ital szerepel-e az árlistán. OBJEKTUM-ORIENTÁLT PARADIGMA – 2. PÉLDA Hol szerepelhet ez a kódrészlet? Csak a vezérlő osztályban, mert „alap”-osztályban NINCS kiíratás!!

28 Ugyanez „alap”-osztályban: OBJEKTUM-ORIENTÁLT PARADIGMA – 2. PÉLDA vagy valami ehhez hasonló.

29 Vannak emberek, akik szeretnek inni. Ezeket az embereket jellemzi a nevük, és van valamennyi pénzük. Rendelhetnek italt, majd kapnak számlát. OBJEKTUM-ORIENTÁLT PARADIGMA – 2. PÉLDA Mezők: nev, emberPenze, fizetendo, (rendeltItalokListaja) Metódusok: void rendel(), String szamla(), (void fizet()), get/set A konstruktor paraméterei: nev, emberPenze

30 A metódusok lehetséges megfogalmazása: OBJEKTUM-ORIENTÁLT PARADIGMA – 2. PÉLDA A toString() ugyanilyen metódus, vagyis abban is lehet pl. elágazás.

31 Feladat: vannak dolgozók, kérdés az átlagfizetés, legidősebb, legfiatalabb ember, stb. class Vezerloclass Dolgozo egyetlen dolgozót jellemző – adatok – metódusok – adatok beolvasása – dolgozók példányosítása – adatok kiíratása – átlagfizetés kiszámolása – legidősebb meghatározása – legfiatalabb meghatározása – stb. OBJEKTUM-ORIENTÁLT PARADIGMA – 3. PÉLDA

32 3. PÉLDA – LEHETSÉGES SZERKEZET helyett:

33 KITÉRŐ: DÁTUMKEZELÉS

34

35 Az OOP alapelvei: – egységbezárás; – öröklődés; – polimorfizmus (sokalakúság) OBJEKTUM-ORIENTÁLT PARADIGMA – ALAPELVEK Egységbezárás (az információ elrejtése): Az objektumokat nem lehet kívülről nem várt módon manipulálni. Csak meghatározott metódusokon keresztül módosítható az állapot.

36 OBJEKTUM-ORIENTÁLT PARADIGMA – ALAPELVEK

37 OBJEKTUM-ORIENTÁLT PARADIGMA – ÖRÖKLŐDÉS Öröklés (inheritance): Az objektum-osztályok továbbfejlesztésének lehetősége. Ennek során a származtatott osztály örökli ősétől annak attribútumait és metódusait, de ezeket bizonyos szabályok mellett újakkal egészítheti ki, és meg is változtathatja. Az eredeti osztályt ősosztálynak nevezzük az új, tovább- fejlesztett osztályt származtatott osztálynak. (szülő – superclass; gyerek – subclass). Azt a folyamatot, amikor egy már meglévő osztály fel- használásával, kiterjesztésével hozunk létre egy osztályt, öröklődésnek vagy kiterjesztésnek nevezzük

38 Alapgondolat: a gyerekek öröklik őseik metódusait és változóit. Az ősosztály minden metódusa és adattagja a gyerekosztálynak is metódusa és adattagja lesz. (Feltéve, ha az ős megengedi.) A gyerek minden új művelete vagy adata egyszerűen hozzáadódik az örökölt metódusokhoz és adattagokhoz. Minden metódus, amelyet átdefiniálunk a gyerekben, a hierarchiában felülbírálja az örökölt metódust. OBJEKTUM-ORIENTÁLT PARADIGMA – ÖRÖKLŐDÉS

39 Öröklődés – pl.: eszik(): napi 3-szor alszik(): éjjel eszik(): napi 3-szor alszik(): órán is eszik(): napi 2-szer alszik(): éjjel OBJEKTUM-ORIENTÁLT PARADIGMA – ÖRÖKLŐDÉS

40 OOP – ÖRÖKLŐDÉS UML JELÖLÉSE

41 Utód adatai, küldhető üzenetek: OBJEKTUM-ORIENTÁLT PARADIGMA – ÖRÖKLŐDÉS

42

43 Egy ősből több leszármaztatott osztályt is készíthetünk. Az öröklődési hierarchia mélysége tetszőleges. Egy származtatott osztálynak legfeljebb egy szülője lehet (pl.: Pascal, Java, C#) (öröklődési fa) több szülője is lehet (pl.: C++) – (öröklődési gráf) Metódusok törzsét megváltoztathatjuk, visszatérési típusát nem. A változók nevét, típusát sem változtatjuk. Új adatokkal és metódusokkal kiegészíthetjük az osztályt. OBJEKTUM-ORIENTÁLT PARADIGMA – ÖRÖKLŐDÉS

44 ÖRÖKLŐDÉS A JAVA-BAN Öröklődéshez az extends kulcsszót használjuk: [módosító] class UtodOsztaly extends OsOsztaly { //törzs }

45 this objektumreferencia –az aktuális objektumra hivatkozik super objektumreferencia –a közvetlen ősosztályra hivatkozik –változók elérése : super.getVáltozónév() –metódusok elérése : super.metódusnév() Konstruktorok kérdése: az utódok nem öröklik a konstruktorokat, azok megírásáról magunknak kell gondoskodni. Az ős osztály konstruktorának meghívása: super ( paraméterek ) (a super() hivatkozás mindig a konstruktor legelső utasítása!) ÖRÖKLŐDÉS A JAVA-BAN

46 Az ősosztály konstruktorának meghívása: - (1) Ha van közvetlen konstruktorhívás (super kulcsszó), akkor a paraméterlistának megfelelő konstruktor hívódik meg az ősosztályban. - (1) Ha van közvetlen konstruktorhívás (super kulcsszó), akkor a paraméterlistának megfelelő konstruktor hívódik meg az ősosztályban. - (2) Ha nincs közvetlen konstruktorhívás, de van az ősosztályban paraméterek nélküli konstruktor (pl.: default konstruktor), akkor az hívódik meg. - (3) Ha nincs közvetlen konstruktorhívás, és az ősosztályban nincs paraméterek nélküli konstruktor, fordítási hiba keletkezik. ÖRÖKLŐDÉS A JAVA-BAN

47 OOP – BIZTONSÁGI KÉRDÉSEK

48 ÖRÖKLŐDÉS A JAVA-BAN – LÁTHATÓSÁG Láthatóság (hozzáférési mód, védelem): Az utód csak azt láthatja, amit az ős megenged neki (amit nem tilt le). ─ Nyilvános (public): mindenki láthatja – UML jelölés: + ─ Privát (private): csak az osztály saját metódusai férhetnek hozzá – UML jelölés: - ─ Védett (protected): csak az osztályból, leszármazottjaiból és a csomagból lehet hozzáférni. – UML jelölés: # Ha nincs módosító, akkor csak az aktuális csomag osztályai látják egymást.

49 ÖRÖKLŐDÉS A JAVA-BAN – TOVÁBBI MÓDOSÍTÓK ─ final: ebből az osztályból semmi sem származtatható (előny: sebesség) a módosító használható változó és metódusnév előtt is. ─ abstract: „kötelező” származtatni belőle magyarul: nem példányosítható. Az absztrakt metódust a származtatott osztályban felül kell írni (ott mondjuk meg, hogy mit is csináljon), egyébként a származtatott osztály is absztrakt lesz. FONTOS: Adattagok továbbra is private elérésűek legyenek – biztonsági okok.

50 eszik(): napi 3-szor alszik(): éjjel eszik(): napi 3-szor alszik(): órán is eszik(): napi 2-szer alszik(): éjjel ÖRÖKLŐDÉS – PÉLDA

51 A PÉLDA JAVA MEGVALÓSÍTÁSA Helyesen: születési év + eletkor() metódus

52 A PÉLDA JAVA MEGVALÓSÍTÁSA 

53

54

55 3. alapelv: Sokalakúság (polimorfizmus – polymorphism): Ugyanarra a kérelemre a különböző objektumok különböző- képpen reagálnak. (Pl. nem ugyanúgy tanul() egy Fiú, mint egy Lány.) A származtatás során az ős osztályok metódusai újraírás nélkül is képesek legyenek az új, átdefiniált metódusok használatára. Ezt virtuális metódusokon keresztül érhetjük el. Egyes nyelvekben minden metódus virtuális (pl.: Java). Más nyelvekben a metódusoknál külön jelezni kell, hogy melyik a virtuális (pl.: Delphi, C#, C++) OBJEKTUM-ORIENTÁLT PARADIGMA – ALAPELVEK

56 Sokoldalúság (polimorfizmus) – példa: Definiáljuk az egyes osztályokat: Fiú – aki egy Diák { void tanul(){ inkább nagyvonalúan } } Lány – aki egy Diák { void tanul(){ inkább alaposabban } } Definiáljunk egy Diak típusú diakok tömböt, és hívjuk meg: diakok[i].tanul() A fordítóprogram itt még nem tudja, hogy itt fiúról vagy lányról van szó, ez futáskor derül ki. (Futás alatti kötés.) OBJEKTUM-ORIENTÁLT PARADIGMA – ALAPELVEK

57 Objektumok: egy egységben az adatok és a rajtuk végzett műveletek. (Egyszerre a modularitás és a struktúra elemei.) Egységbezárás (az információ elrejtése): Az objektumokat nem lehet kívülről nem várt módon manipulálni. Csak meghatározott metódusokon keresztül módosítható az állapot. Öröklés: Létrehozhatók már létező típusok specializációi, melyek használhatják (és bővíthetik) a létező típusok műveleteit anélkül, hogy újra meg kellene valósítani őket. Polimorfizmus: A referenciák különböző típusú objektumokra hivatkozhatnak, és a hivatkozott objektumoktól függő viselkedést produkálhatnak. OOP ALAPELVEK – ÖSSZEFOGLALVA

58 ÖRÖKLŐDÉS A JAVA-BAN

59 JAVA-ban csak egyszeres öröklődés van – pedig néha kellene többszörös is. (Pl. lakókocsi) DE megvalósítható a többszörös öröklődés is. ÖRÖKLŐDÉS A JAVA-BAN Mi az oka a többszörös öröklődéstől való idegenkedésnek? a többszörös öröklődés problémát jelenthet a fordító számára (pl.: káró típusú öröklési lánc) biztonsági okok (a hackerek könnyen kihasználhatják ezt a problémát)

60 Alaposztály változó metódus() Utód 1_A ………… Utód 1_B ………… Utód 2 ………… KÁRÓ TÍPUSÚ ÖRÖKLÉSI LÁNC Probléma: az Utód2 osztály kétszeresen örökölné az alaposztály tulajdonságait, ez pedig nem lehetséges.

61 TÖBBSZÖRÖS ÖRÖKLÉS – MEGOLDÁS: INTERFÉSZ Az interfész konstans értékek és absztrakt metódusok deklarációjának az összessége. vagyis: a metódusok törzs nélkül vannak deklarálva önmagában nem használhatók, implementálni kell őket az implementációt egy-egy osztály végzi

62 [módosítók] interface InterfeszNev [extends…] { //absztrakt metódusok } – az interfész módosítója csak publikus lehet – az absztrakt metódusok csak publikusak lehetnek – az interfész alapértelmezésben absztrakt (nem lehet példányosítani) TÖBBSZÖRÖS ÖRÖKLÉS – MEGOLDÁS: INTERFÉSZ Interfész létrehozása:

63 [módosítók] class OsztályNév implements InterfészNév{ //absztrakt metódusok } Több intrefész implementálása esetén vesszővel felsoroljuk az implements kulcsszó után az összes interfész nevét KÖTELEZŐ AZ ÖSSZES ABSZTRAKT METÓDUS IMPLEMENTÁLÁSA!!! Interfész implementálása: TÖBBSZÖRÖS ÖRÖKLÉS – MEGOLDÁS: INTERFÉSZ

64 Ezért alkalmas a többszörös öröklés megvalósítására!!! TÖBBSZÖRÖS ÖRÖKLÉS – MEGOLDÁS: INTERFÉSZ Egy osztály több interfészt is implementálhat: Interfészek között is létezik öröklődés – jelölése szintén az extends kulcsszó. Sőt, interfészek között többszörös öröklődés is lehet:

65 INTERFÉSZ – UML (PÉLDA)

66 INTERFÉSZ – PÉLDA

67

68 Lehet-e egy forrásfájlban az összes?

69 INTERFÉSZ – PÉLDA Fordításkor létrejött fájlok: Ital.class Alkohol.class Sor.class Pelda.class Eredmény:

70 INTERFÉSZ ALKALMAZÁSOK Interfész „saját” alkalmazása: Ha nagy a projekt, és többen dolgoznak rajta, akkor először célszerű felületeket tervezni interface alapon, azután jöhet az osztálygyártás. – Az interfész egy vázat ad (egy tervrajz). A Java sok „kész” interfészt használ: A Java fejlődése: Egy új igény esetén születik egy jsr (Java Service Request) felület-definíció (interface), majd a gyártók elkészítik a saját megvalósításaikat. Ilyen pl. jdbc. A jdbc egy interface gyűjtemény (felület), amelyet minden adatbázisgyártó implementál. A grafikus csomagok is sok interfészt használnak.

71

72


Letölteni ppt "Programozás III OOP ÖRÖKLŐDÉS, INTERFÉSZ. Objektumok: egy egységben az adatok és a rajtuk végzett műveletek. (Egyszerre a modularitás és a struktúra elemei.)"

Hasonló előadás


Google Hirdetések