Alkalmazott modul: Programozás 10. előadás. Objektumorientált programozás: tervezés és megvalósítás

Hasonló dokumentumok
Bevezetés a Programozásba II 5. előadás. Objektumorientált programozás és tervezés

Szoftvertechnológia 3. előadás. Objektumorientált tervezés: alapismeretek. Giachetta Roberto. Eötvös Loránd Tudományegyetem Informatikai Kar

Informatikai Kar. 3. fejezet. alapismeretek. Giachetta Roberto

Informatikai Kar. 4. fejezet. Giachetta Roberto

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

Objektumelvű programozás

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

Szoftvertechnológia 4. előadás. Objektumorientált tervezés: általánosítás. Giachetta Roberto. Eötvös Loránd Tudományegyetem Informatikai Kar

Alkalmazott Modul III 4. előadás. Objektumorientált programozás: objektumok és osztályok. Procedurális programozás Koncepció

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

Bevezetés a Programozásba II 2. előadás. Adattípusok megvalósítása egységbe zárással. Adattípusok megvalósítása egységbe zárással

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

Bevezetés a Programozásba II 3. előadás. Biztonságos adattípusok megvalósítása

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

Bevezetés a Programozásba II 3. előadás. Biztonságos adattípusok megvalósítása. Biztonságos adattípusok megvalósítása

Osztályok. 4. gyakorlat

Alkalmazott modul: Programozás 9. előadás. Strukturált programozás: dinamikus adatszerkezetek

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

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

Bevezetés a Programozásba II 11. előadás. Adatszerkezetek megvalósítása. Adatszerkezetek megvalósítása Adatszerkezetek

3. Osztályok II. Programozás II

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

és az instanceof operátor

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

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

OOP #14 (referencia-elv)

OOP. Alapelvek Elek Tibor

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

Programozási technológia

Bevezetés, a C++ osztályok. Pere László

Adatstruktúrák, algoritmusok, objektumok

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

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

STL gyakorlat C++ Izsó Tamás május 9. Izsó Tamás STL gyakorlat/ 1

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

Interfészek. PPT 2007/2008 tavasz.

Előzmények

500. AA Megoldó Alfréd AA 500.

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

Programozási nyelvek Java

III. OOP (objektumok, osztályok)

JAVA PROGRAMOZÁS 2.ELŐADÁS

Programozási nyelvek Java

Elemi Alkalmazások Fejlesztése II.

Programfejlesztési Modellek

Alkalmazott modul: Programozás 8. előadás. Strukturált programozás: dinamikus memóriakezelés. Dinamikus memóriakezelés. Dinamikus memóriakezelés

Alkalmazott modul: Programozás 10. fejezet. Strukturált programozás: dinamikus memóriakezelés. Giachetta Roberto

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

Programozási alapismeretek 4.

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

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

Java és web programozás

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

Programozási nyelvek Java

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

Programozási nyelvek Java

1. Mi a fejállományok szerepe C és C++ nyelvben és hogyan használjuk őket? 2. Milyen alapvető változókat használhatunk a C és C++ nyelvben?

C++ programozási nyelv

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

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

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

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

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

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

Bevezetés a Programozásba II 12. előadás. Adatszerkezetek alkalmazása (Standard Template Library)

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

Webes alkalmazások fejlesztése 10. előadás. Webszolgáltatások tesztelése (ASP.NET Core) Cserép Máté

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.

Programozás II gyakorlat. 8. Operátor túlterhelés

Objektum orientált programozás Bevezetés

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

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

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

Programozás II. 4. Dr. Iványi Péter

Eseményvezérelt alkalmazások fejlesztése II. A.NET keretrendszer és a C# programozási nyelv. Objektumorientált programozási nyelvek A Smalltalk nyelv

Java VII. Polimorfizmus a Java nyelvben

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

Már megismert fogalmak áttekintése

Java VII. Polimorfizmus a Java nyelvben

128. AA Megoldó Alfréd AA 128.

Programozási technológia

OOP és UML Áttekintés

UML (Unified Modelling Language)

Alkalmazott modul: Programozás 6. előadás. Strukturált programozás: újrafelhasználható adattípusok

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

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

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

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

Bevezetés a programozásba. 9. Előadás: Rekordok

500. CC Megoldó Alfréd CC 500.

Alkatresz::Alkatresz(string n; int csz, int a) { nev = n; cikkszam = csz; ar = a; };

Bevezetés a programozásba Előadás: A const

Bevezetés a Programozásba II 4. előadás. Adattípusok hordozhatósága

I. Objektumorientált programozás

C++ programozási nyelv Konstruktorok-destruktorok

Generikus Típusok, Kollekciók

Programozási technológia 1.

Pénzügyi algoritmusok

Bevezetés a programozásba Előadás: Tagfüggvények, osztály, objektum

Átírás:

Eötvös Loránd Tudományegyetem Informatikai Kar Alkalmazott modul: Programozás 10. előadás Objektumorientált programozás: tervezés és megvalósítás Giachetta Roberto groberto@inf.elte.hu http://people.inf.elte.hu/groberto

Objektumorientált programozás Kialakulása A procedurális programozási paradigma összetett alkalmazások esetén számos korlátozást tartalmaz: a program nem tagolható kellő mértékben az adatok élettartama nem eléggé testre szabható a feladat módosítása utóhatásokkal rendelkezhet Ezek megoldása a felelősség továbbadása programegységeket alakítunk ki, amely rendelkeznek saját adataikkal és műveleteikkel, ezeket egységbe zárjuk, megvalósításukat elrejtjük a feladat megoldását a programegységek együttműködésével, kommunikációjával valósítjuk meg ELTE IK, Alkalmazott modul: Programozás 10:2

Objektumorientált programozás Objektumok Objektumnak (object) nevezzük a feladat egy adott tárgyköréért felelős programegységet, amely tartalmazza a tárgykör megvalósításához szükséges adatokat, valamint műveleteket az objektum működése során saját adatait manipulálja, műveleteit futtatja és kommunikál a többi objektummal pl.: egy téglalap adatai: szélessége és magassága műveletei: területkiszámítás, méretváltoztatás pl.: egy verem adatszerkezet adatai: elemek tartalmazó tömb és a felhasznált méret műveletei: push, pop, top ELTE IK, Alkalmazott modul: Programozás 10:3

Objektumorientált programozás Objektumok állapotai Az objektumok állapottal (state) rendelkeznek, ahol az állapot mezőértékeinek összessége két objektum állapota ugyanaz, ha értékeik megegyeznek (ettől függetlenül az objektumok különbözőek) az állapot valamilyen esemény (műveletvégzés, kommunikáció) hatására változhat meg A program teljes állapotát a benne lévő objektumok összállapota adja meg Az objektumok életciklussal rendelkeznek, létrejönnek (a konstruktorral), működést hajtanak végre (további műveletekkel), majd megsemmisülnek (a destruktorral) ELTE IK, Alkalmazott modul: Programozás 10:4

Objektumorientált programozás Objektum-orientált programok Objektum-orientáltnak nevezzük azt a programot, amelyet egymással kommunikáló objektumok összessége alkot minden adat egy objektumhoz tartozik, és minden művelet egy objektumhoz rendelt tevékenység, nincsenek globális adatok, vagy globális műveletek a program így kellő tagoltságot kap az objektumok mentén az adatok élettartama így összekapcsolható az objektum élettartamával a módosítások általában az objektum belsejében véghezvihetők, ami nem befolyásolja a többi objektumot, így nem szükséges jelentősen átalakítani a programot ELTE IK, Alkalmazott modul: Programozás 10:5

Objektumorientált programozás Objektum-orientált programok Az objektum-orientáltság öt alaptényezője: absztrakció: az objektum reprezentációs szintjének megválasztása enkapszuláció: az adatok és alprogramok egységbe zárása, a belső működés elrejtése nyílt rekurzió: az objektum mindig látja saját magát, eléri műveleteit és adatait öröklődés: az objektum tulajdonságainak átruházása más objektumokra polimorfizmus és dinamikus kötés: a műveletek futási időben történő működéshez kötése ELTE IK, Alkalmazott modul: Programozás 10:6

Objektumorientált programozás Osztályok Az objektumok viselkedési mintáját az osztály tartalmazza, az osztályból példányosíthatjuk az objektumokat tehát az osztály az objektum típusa Az osztályban tárolt adatokat attribútumoknak, vagy mezőknek (field), az általa elvégezhető műveleteket metódusoknak (method) nevezzük, együtt ezek az osztály tagjai (member) Az osztály tagjainak szabályozhatjuk a láthatóságát, a kívülről látható részét interfésznek, a kívülről nem látható részét implementációnak nevezzük a metódusok megvalósítása az implementáció része, tehát más osztályok számára a működés mindig ismeretlen ELTE IK, Alkalmazott modul: Programozás 10:7

Objektumorientált programozás Osztályok megvalósítása Az osztályokat minden nyelv más formában valósítja meg, de az általános jellemzőket megtartja A C++ programozási nyelv támogatja az objektumorientált programozást, noha alapvetően procedurális A C++ osztály szerkezete: class/struct <osztálynév> { public/private: <típus> <mezőnév>; <típus> <metódusnév> ([ <paraméterek> ]) { } }; ELTE IK, Alkalmazott modul: Programozás 10:8

Szoftverek tervezése A program szerkezetének és működésének megtervezése az osztályok és objektumok szempontjából történik a statikus tervezés során az objektumok, osztályok felépítését és kapcsolatait határozzuk meg a dinamikus tervezés során az objektumok, osztályok közötti kommunikáció folyamatát, az állapotváltoztatásokat határozzuk meg Az objektumorientált tervezés eszköze a Unified Modeling Language (UML), amely egy grafikus programozási nyelv 13 diagramtípust biztosít a program szerkezetének és működésének megtervezésére ELTE IK, Alkalmazott modul: Programozás 10:9

Az UML nyelv Az UML a szoftverrendszert a következő szempontok szerint tudja jellemezni: funkcionális modell: a szoftver funkcionális követelményeit és a felhasználóval való interakciókat adja meg pl.: felhasználói esetek diagramja, kihelyezési diagram szerkezeti modell: a program felépítését adja meg, milyen osztályok, objektumok, relációk alkotják a programot pl.: osztálydiagram, objektumdiagram dinamikus modell: a program működésének lefolyását, az objektumok együttműködésének módját ábrázolja pl.: állapotdiagram, szekvenciadiagram ELTE IK, Alkalmazott modul: Programozás 10:10

Az UML nyelv diagram szerkezeti diagram viselkedési diagram Komponens Kihelyezési Csomag Osztály Objektum Felhasználói esetek Állapot Aktivációs interakciós Összetett struktúra Szekvencia Időzítés Kommunikációs Interakciós áttekintés ELTE IK, Alkalmazott modul: Programozás 10:11

Az osztálydiagram Az osztálydiagram a programban szereplő osztályok szerkezetét, és a közöttük lévő kapcsolatokat definiálja az osztálynak megadjuk a nevét, valamint mezőinek és metódusainak halmazát (típusokkal, paraméterekkel) megadjuk a tagok láthatóságát látható (+), illetve rejtett (-) jelölésekkel <osztálynév> - <mezőnév> :<típus>... + <metódusnév>(<paraméterek>) :<típus>... ELTE IK, Alkalmazott modul: Programozás 10:12

Példa Feladat: Valósítsuk meg a téglalap (Rectangle) osztályt, amely utólag átméretezhető, és le lehet kérdezni a területét és kerületét. a téglalapnak a feladat alapján elég a méreteit letárolni (_height, _width), amelyek egész számok lesznek ezeket a későbbiekben lekérdezhetjük (getwidth(), getheight()), vagy felülírhatjuk (setwidth(int), setheight(int)) lehetőséget adunk a terület, illetve került lekérdezésére (area(), perimeter()) lehetőséget adunk a téglalap létrehozására a méretek alapján (Rectangle(int, int)) ELTE IK, Alkalmazott modul: Programozás 10:13

Példa Tervezés: Rectangle - _width :int - _height :int + Rectangle(int, int) + area() :int + perimeter() :int + getwidth() :int + getheight() :int + setwidth(int) :void + setheight(int) :void ELTE IK, Alkalmazott modul: Programozás 10:14

Példa Megoldás: class Rectangle // téglalap osztálya { private: int _width; // szélesség int _height; // magasság public: // látható rész Rectangle(int w, int h) { } // 2 paraméteres konstruktor művelet int area(); // téglalap területe int perimeter(); // téglalap kerülete }; ELTE IK, Alkalmazott modul: Programozás 10:15

Az osztálydiagram Az osztálydiagram számos kiegészítést tartalmazhat feltételeket szabhatunk a mezőkre, metódusokra a { } jelzéssel (pl. a lekérdezést a {query} jelzéssel jelölünk) adhatunk az osztálynak sablonparamétert további tulajdonságokat jelölhetjük, illetve csoportba foglalásokat végezhetünk a << >> jelzéssel <osztálynév> <sablon> - <mezőnév> :<típus> {<felvétel>} + <metódusnév>() :<típus> {query} ELTE IK, Alkalmazott modul: Programozás 10:16

Példa Feladat: Valósítsuk meg a verem (Stack) osztályt, ahol tetszőleges számban helyezhetjük a verembe az elemeket. a verem műveletei a behelyezés (push), kivétel (pop), tetőelem lekérdezés (top) lesznek, továbbá segédműveletként megjelenik az üresség (isempty), a méret (size) lekérdezése, valamint a kiürítés (clear) annak érdekében, hogy a verem bármilyen elemet fogadhasson, sablonosan fogalmazzuk meg a tetszőleges bővíthetőség érdekében dinamikus tömbbel valósítjuk meg (_values), amely automatikusan méreteződik (resize segédművelettel) elem hozzáadásakor, illetve törlésekor ELTE IK, Alkalmazott modul: Programozás 10:17

Példa eltároljuk a teljes és a felhasznált méretet (_size, _top), amely nem lehet negatív a dinamikus reprezentáció miatt megvalósítjuk a konstruktor mellett a destruktort, másoló konstruktort, valamint értékadás operátort a mezőket, valamint a átméretező segédműveletet elrejtjük a lekérdező műveleteket (top, isempty, size) konstanssá alakítjuk, így konstans példányra is meghívhatóak lesznek ELTE IK, Alkalmazott modul: Programozás 10:18

Példa Tervezés: T : class Stack - _values :T[] - _top :int { _top 0 } - _size :int { _size 0 } + Stack(int) + ~Stack() + isempty() :bool {query} + isfull() :bool {query} + push(t) :void + pop() :T + top() :T {query} + clear() :void + size() :int {query} ELTE IK, Alkalmazott modul: Programozás 10:19

Példa Megoldás: template <class T> class Stack { // verem osztály private: T* _values; int _top; int _size; void resize(int newsize); public: Stack(); Stack(const Stack<T>& other); ~Stack(); bool isempty() const; ELTE IK, Alkalmazott modul: Programozás 10:20

Objektumok közötti kapcsolatok Az alkalmazásokban rendszerint több osztály szerepel, amelyek objektumai kommunikálhatnak egymással, ezért az osztályok között relációkat állíthatunk fel az asszociáció (association) egy kommunikációs kapcsolat, ahol egy objektum üzenetet küldhet egy (vagy több) további objektumnak <osztály> <asszociáció> <osztály> a kommunikáció lehet irányított, irányítatlan (kétirányú), reflexív (saját osztály másik objektumára) az osztályoknak lehet multiplicitása, ami a relációbeli számosságukra utal ELTE IK, Alkalmazott modul: Programozás 10:21

Példa Feladat: Valósítsuk meg a 2D koordinátarendszerben ábrázolható pontokat (Point), valamint vektorokat (Vector). A pontok eltolhatóak vektorral, illetve megadható két pont távolsága. A vektornak ismert a hossza. a pont ábrázolható a vízszintes és függőleges értékkel (_x, _y), amelyek lekérdezhetőek (getx(), gety()) lekérdezhető a távolsága egy másik ponthoz képest (distance(point)), valamint eltolható egy vektorral (move(vector)) a vektor ábrázolható a vízszintes és függőleges eltéréssel (_deltax, _deltay), amelyek lekérdezhetőek (getdeltax(), getdeltay()), ahogy a hossza (length()) is ELTE IK, Alkalmazott modul: Programozás 10:22

Példa Tervezés: - _x :int - _y :int Point + Point(int, int) + distance(point) :double {query} + move(vector) :void + getx() :int {query} + gety() :int {query} distance(point) move(vector) Vector - _deltax :int - _deltay :int + Vector(int, int) + length() :double {query} + getdeltax() :int {query} + getdeltay() :int {query} ELTE IK, Alkalmazott modul: Programozás 10:23

Példa Megoldás (point.hpp): #include <cmath> #include "vector.hpp" class Point { // 2D pont osztály public: Point(int x = 0, int y = 0) { _x = x; _y = y; } double distance(point p) const { } void move(vector v) { _x += v.getdeltax(); _x += v.getdeltay(); } int getx() const { return _x; } ELTE IK, Alkalmazott modul: Programozás 10:24

Objektumok közötti kapcsolatok Az aggregáció (aggregation) egy speciális asszociáció, amely az objektumok laza egymáshoz rendelését fejezi ki <osztálynév> <szerep> <osztálynév> egy tartalmazási, rész/egész kapcsolatot jelent, amely állandó a két objektum között a részt vevő objektumok életpályája különbözik, egymástól függetlenül is léteznek az aggregált osztálynak lehet szerepe, ami a relációbeli minőségükre utal, ezt az adott végponton jelöljük (ez is megjelölhető láthatósággal) ELTE IK, Alkalmazott modul: Programozás 10:25

Objektumok közötti kapcsolatok aggregációs kapcsolat megvalósításakor az aggregált osztály egy hivatkozását (mutatóját, vagy referenciáját) tároljuk el, mivel így pl.: nem kötjük össze a két objektum életpályáját (egyik megsemmisülése nem vonja maga után a másik megsemmisülését), így egymástól függetlenül kezelhetőek egy sekély másolatát kezeljük a megadott objektumnak MyType -mytype MyOtherType - mytype :MyType* + MyOtherType(MyType*) ELTE IK, Alkalmazott modul: Programozás 10:26

Objektumok közötti kapcsolatok pl.: class SomeClass { }; // aggregált osztály class OtherClass { private: SomeClass* somefield; // egy mutatót tárolunk public: OtherClass(SomeClass* s) : somefield(s) { } }; SomeClass sc; OtherClass oc(&sc); // csak sekély másolatot készítünk ELTE IK, Alkalmazott modul: Programozás 10:27

Példa Feladat: Valósítsuk meg a csoportosítható téglalapokat. A téglalapot (Rectangle) tetszőleges csoportba (Group) helyezhetjük (insert(rectangle)), illetve kivehetjük belőle (remove(rectangle)). Lehetőségünk van a csoportban lévő téglalapok összterületét (area()), illetve összkerületét (perimeter()) lekérdezni. a téglalap megvalósítása változatlan marad, a téglalapokat aggregációval rendeljük a csoporthoz egy téglalap több csoportban is szerepelhet, illetve egy csoportban tetszőleges sok téglalap lehet a csoportban felvesszük a téglalapok tömbjét (_rectangles) ELTE IK, Alkalmazott modul: Programozás 10:28

Példa Tervezés: Rectangle - _width :int - _height :int + Rectangle(int, int) + area() :int + perimeter() :int + getwidth() :int + getheight() :int + setwidth(int) :void + setheight(int) :void -_rectangles * * Group - _rectangles :Rectangle*[] + insert(rectangle*) :void + remove(rectangle*) :void + area() :int {query} + perimeter() :int {query} ELTE IK, Alkalmazott modul: Programozás 10:29

Példa Megoldás (group.hpp): class Group { private: vector<rectangle*> _rectangles; // vector-t választunk a megvalósításban, és // csak hivatkozásokat kezelünk public: void insert(rectangle* rec); // csak hivatkozásokat veszünk át void remove(rectangle* rec); double area() const; double perimeter() const; }; ELTE IK, Alkalmazott modul: Programozás 10:30

Objektumok közötti kapcsolatok A kompozíció (composition) egy speciális asszociáció, amely az objektumok szoros egymáshoz rendelését fejezi ki <osztálynév> <szerep> <osztálynév> fizikai tartalmazást jelent, így nem lehet reflexív, vagy ciklikus a tartalmazott objektum életpályáját a tartalmazó felügyeli a tartalmazó objektum megsemmisülésekor a tartalmazott is megsemmisül ELTE IK, Alkalmazott modul: Programozás 10:31

Példa Feladat: Valósítsuk meg a 2D koordinátarendszerben ábrázolható téglalap (Rectangle) osztályt, amely párhuzamos/merőleges a koordinátatengelyre, lekérdezhető a területe, átméretezhető, illetve eltolható egy megadott vektorral. a téglalapot elhelyezzük a koordinátarendszerben, amihez el kell tárolnunk legalább egy koordinátáját, legyen ez a bal alsó sarok (_point) ehhez szükséges a pont (Point) típusa, amit egybekötünk a téglalap élettartamával, azaz kompozícióval helyezzük a téglalapba a téglalap eltolásához (move()) igazából a bal alsó koordinátát kell eltolnunk ELTE IK, Alkalmazott modul: Programozás 10:32

Példa Tervezés: Point - _x :int - _y :int + Point(int, int) + distance(point) :double {query} + move(vector) :void + getx() :int {query} + gety() :int {query} Vector - _deltax :int - _deltay :int move(vector) + Vector(int, int) + length() :double {query} + getdeltax() :int + getdeltay() :int -_point move(vector) Rectangle - _width :int - _height :int - _point :Point + Rectangle(Point, int, int) + area() :int {query} + perimeter() :int + move(vector) :void + getpoint() :Point {query} + getwidth() :int {query} + getheight() :int {query} + setwidth(int) :void + setheight(int) :void ELTE IK, Alkalmazott modul: Programozás 10:33

Példa Megoldás (rectangle.hpp): #include "vector.hpp" #include "point.hpp" class Rectangle { public: Rectangle(Point p, int w, int h) { } void move(vector v) { _point.move(v); } private: Point _point; }; ELTE IK, Alkalmazott modul: Programozás 10:34

Objektumorientált programozás Érték inicializálás Amennyiben egy osztály mezőként szerepel egy másik osztályban, még a konstruktor lefutása előtt inicializálni kell amennyiben van paraméter nélküli konstruktora, ez automatikusan megtörténik amennyiben csak paraméteres konstruktora van, az inicializálást manuálisan (a paraméterek megadásával) kell elvégezni, a konstruktor törzse előtt, kettősponttal megadva a megfelelő paraméterezést: <osztálynév>(<típus> <paraméter>) : <mezőnév>(<kezdőérték>), <mezőnév>(<kezdőérték>), { // konstruktor törzse } ELTE IK, Alkalmazott modul: Programozás 10:35

Objektumorientált programozás Érték inicializálás Pl.: class Rectangle { // téglalap osztály Rectangle(Point p, int x, int y); }; Rectangle:: Rectangle(Point p, int x, int y) : _point(p) // inicializálás { _width = w > 0? w : 0; _height = h > 0? h : 0; // további kezdőértékek beállítása } ELTE IK, Alkalmazott modul: Programozás 10:36

Objektumorientált programozás Ciklikus aggregáció Az osztályok közötti kapcsolatok könnyen ciklikussá válhatnak pl. két osztály kölcsönösen hivatkozhat egymásra, azaz aggregálhatja a másik osztály egy példányát SomeClass - otherfield :OtherClass -somefield -otherfield OtherClass - somefield :SomeClass Ez a megvalósításban azt eredményezné, hogy mindkét osztálynak ismernie kell a másikat egy fájlon belül mindkettőnek meg kell előznie a másikat külön fájlok esetén mindegyikbe kell hivatkozni (másolni) a másikat (#include) ELTE IK, Alkalmazott modul: Programozás 10:37

Objektumorientált programozás Osztálydeklarációk A ciklikus relációk feloldásáért osztálydeklarációkat kell alkalmaznunk, amely során csak az osztály nevét adjuk meg ezzel jelöljük, hogy a megadott osztály létezik, de nem fedjük fel az interfészét (pl. konstruktor), így csak hivatkozást (referencia, mutató) adhatunk rá pl. (someclass.hpp): class OtherClass; // osztály deklarációja class SomeClass { OtherClass* otherfield; // a deklarált osztály felhasználható lesz }; ELTE IK, Alkalmazott modul: Programozás 10:38

Objektumorientált programozás Osztálydeklarációk ahhoz, hogy a megvalósítást is elérjük, a teljes osztályt be kell töltenünk (#include), ám ezt elég csak a törzsfájlban megtennünk, így elkerülve a ciklikus hivatkozást pl. (someclass.cpp): #include "someclass.hpp" #include "otherclass.hpp" // itt már használható a teljes osztálydefiníció SomeClass::SomeClass() { otherfield = new OtherClass( ); // már ismert az interfész, és benne a // konstruktor } ELTE IK, Alkalmazott modul: Programozás 10:39

Objektumorientált programozás Példa Feladat: Készítsünk egy programot, amelyben egyetemi oktatók, hallgatók és kurzusok adatait tudjuk tárolni. a hallgató (UniversityStudent) és az oktató (UniversityTeacher) rendelkezik névvel, Neptun kóddal és jelszóval, valamint kurzusokkal, a hallgató ezen felül kreditekkel a kurzus (Course) rendelkezik névvel, oktatóval, hallgatókkal, kreditszámmal és maximális létszámmal a kurzus létrehozásakor megkapja az oktatót, amely szintén felveszi azt saját kurzusai közé, míg a hallgató felveheti a kurzust, amennyiben még van szabad hely (ekkor a kurzus megjelenik a hallgatónál, és a hallgató is a kurzusnál ELTE IK, Alkalmazott modul: Programozás 10:40

Objektumorientált programozás Példa Tervezés: UniversityTeacher - _name :string - _neptuncode :string - _neptunpassword :string - _courses :vector<course> + UniversityTeacher(string) + name() :string {query} + neptuncode() :string {query} + courses() :vector<course> {query} + newcourse(course) :void -_teacher -_students 0..maxCount() UniversityStudent - _name :string - _neptuncode :string - _neptunpassword :string - _courses :vector<course> + UniversityStudent(string) + name() :string {query} + neptuncode() :string {query} + courses() :vector<course> {query} + newcourse(course) :void + numberofcredits() :int {query} Course -_courses * - _coursename :string - _teacher :UniversityTeacher - _credits :int - _maxcount :int - _students :vector<universitystudent> + Course(string, UniversityTeacher, int, int) + newstudent(universitystudent) :bool + name() :string {query} + teacher() :UniversityTeacher {query} + credits() :int {query} + maxcount() :int {query} + currentcount() :int {query} -_courses * ELTE IK, Alkalmazott modul: Programozás 10:41

Objektumorientált programozás Példa Megoldás (universityteacher.hpp): #include <vector> #include <string> class Course; // osztályok deklarálása a ciklikus hivatkozás // elkerülése végett class UniversityTeacher // oktató osztály { std::vector<course*> _courses; // mutatókat tárolunk }; ELTE IK, Alkalmazott modul: Programozás 10:42

Objektumorientált programozás Példa Megoldás (universitystudent.cpp): void UniversityStudent::newCourse(Course* c){ if (c->newstudent(this)) // ha a kurzus felveszi a hallgatót _courses.push_back(c); // csak akkor veheti fel a hallgató a // kurzust } ELTE IK, Alkalmazott modul: Programozás 10:43