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 I. Objektumorientált paradigma II. Osztályok és objektumok a memóriában Öröklés és többalakúság OOP alapelvek OOP modellezés.

Hasonló előadás


Az előadások a következő témára: "Programozás I. Objektumorientált paradigma II. Osztályok és objektumok a memóriában Öröklés és többalakúság OOP alapelvek OOP modellezés."— Előadás másolata:

1 Programozás I. Objektumorientált paradigma II. Osztályok és objektumok a memóriában Öröklés és többalakúság OOP alapelvek OOP modellezés

2 Programozás I. Osztályszintű tagok

3 3 / 61 ÓE-NIK, 2014 Példányszintű tagok Objektumokhoz tartozó mezők és metódusok A példányszintű tagok az objektumpéldányok –saját adatmezői, valamint –saját adatain műveleteket végző metódusai Elemek=... (2D tömb) Mátrix mátrix1 EgységmátrixE() Egyezik(másik mátrix) Szorzás(pont) Szorzás(vektor)

4 4 / 61 ÓE-NIK, 2014 Osztályszintű tagok Osztályokhoz tartozó mezők és metódusok Az osztályszintű tagokkal (mezőkkel, metódusokkal) példányoktól független adattartalom és működés reprezentálható Elemek=... (2D tömb) Mátrix mátrix1 EgységmátrixE() MaxSor=3 MaxOszlop=3 Osztályszintű mező: –Egyszer van tárolva, függetlenül az osztályból létrehozott objektumpéldányok számától... (továbbiak) Egyezik(másik mátrix)

5 5 / 61 ÓE-NIK, 2014 Osztályszintű tagok Osztályszintű metódusok –Akkor is elérhetők, ha az osztályból egyetlen objektum sem lett példányosítva –Logikailag nem egy konkrét, már létező példányhoz kötődő feladatok végrehajtására alkalmasak Elemek=... (2D tömb) Mátrix mátrix1 EgységmátrixE() MaxSor=3 MaxOszlop=3... (továbbiak) Egyezik(másik mátrix) GenerálEgységmátrix() GenerálStringből(string) Egyezik(mátrixA, mátrixB)

6 6 / 61 ÓE-NIK, 2014 Osztályszintű tagok A static kulcsszóval képezzük őket az osztálydeklaráción belül, és egy adott példány neve helyett a típus nevével hivatkozunk rájuk –Osztályszintű tag lehet: adattag, metódus, tulajdonság, konstruktor (stb.), sőt maga az osztály is lehet statikus –Az eddig ismert (nem static kulcsszóval deklarált) tagok "példányszintűek" voltak Számtalan példa az osztálykönyvtárban: –Vagy pl. a főprogram (Main()) public static int kozosAdattag; //osztályszintű változó public static void PeldanytolFuggetlenFuggveny() {... } //osztályszintű függvény Osztaly.kozosAdattag = 4; Osztaly.PeldanytolFuggetlenFuggveny(); C# i = int.Parse(s); //statikus metódus Console.WriteLine(s); //statikus metódus

7 7 / 61 ÓE-NIK, 2014 Osztályszintű metódusok class Vektor { private double x; public double X { get { return x; } set { x = value; } } private double y; public double Y { get { return y; } set { y = value; } } public Vektor(double x, double y) { this.x = x; this.y = y; } public static Vektor Parse(string str) { int vesszo = str.IndexOf(','); int x = int.Parse(str.Substring(0, vesszo)); int y = int.Parse(str.Substring(vesszo+1)); return new Vektor(x,y); } Console.WriteLine("Írj be egy vektort (x,y formában): "); string s = Console.ReadLine(); Vektor v = Vektor.Parse(s);

8 8 / 61 ÓE-NIK, 2014 Osztályszintű metódusok 8 ÓE-NIK, 2013 class Vektor { private double x; public double X { get { return x; } set { x = value; } } private double y; public double Y { get { return y; } set { y = value; } }... public Vektor Osszead(Vektor b) { return new Vektor(x + b.x, y + b.y); } public static Vektor Osszead(Vektor a, Vektor b) { return new Vektor(a.x + b.x, a.y + b.y); } Vektor v = new Vektor(1, 1); Vektor v2 = new Vektor(2, 3); Vektor sum = Vektor.Osszead(v, v2); Vektor sum2 = v.Osszead(v2); Console.WriteLine(sum.X + "," + sum.Y); Console.WriteLine(sum2.X + "," + sum2.Y); Sok esetben ugyanazt a funkcionalitást statikus és nem statikus formában is meg tudjuk valósítani

9 9 / 61 ÓE-NIK, 2014 Osztályszintű vagy példányszintű metódus? Legyen példányszintű, ha az adott példány állapotát módosítja Legyen osztályszintű, ha az adott példánytól független a működés, amit reprezentál Gyakran bizonytalan –Ízlés és a fejlesztői közösség szokása dönthet, sokan a példányszintű metódusokat preferálják ilyenkor Egyéb szempontok: –Ha bárhonnan, bármikor el kell tudni érni (kisebb, gyakran használt segédfüggvények), akkor sokszor statikus (pl. Math osztály függvényei) –A statikus függvények kicsit gyorsabbak Szinte soha nem jelentős a teljesítmény, amit nyerünk így –Bizonyos esetekben kötelező egy adott metódust statikusnak megírni Pl. főprogram, operátorok, kiegészítő metódusok stb. public void Szoroz(double s) { x = x * s; y = y * s; }

10 10 / 61 ÓE-NIK, 2014 Osztályszintű tagok - példa using System; class Példányszámláló { private static int darabszám = 0; public static int Darabszám; { get { return darabszám ; } } static Példányszámláló() { darabszám = 0; } public Példányszámláló() { darabszám++; } ~Példányszámláló() { darabszám--; Console.WriteLine("Megszűnt egy példány. A fennmaradók száma: " + darabszám); } Osztályszintű adatmező Osztályszintű konstruktor (fő célja az osztályszintű mezők kezdeti értékének beállítása) KonstruktorDestruktor C#

11 11 / 61 ÓE-NIK, 2014 Osztályszintű tagok - példa class PéldányszámlálóTeszt { static void Main() { Példányszámláló teszt = new Példányszámláló(); Console.WriteLine("Létrehoztam egy példányt"); Console.WriteLine("Példányszám: " + Példányszámláló.Darabszám); for (int i = 0; i < 10; i++) new Példányszámláló(); Console.WriteLine("Létrehoztam még tíz példányt"); Console.WriteLine("Példányszám: " + Példányszámláló.Darabszám); Console.ReadLine(); } C#

12 12 / 61 ÓE-NIK, 2014 Ismétlés – példa: Téglalap osztály 1. class Téglalap { private int x; private int y; private int szélesség; private int magasság; public int X { get { return x; } set { x = value; } } //... public Téglalap(int x, int y, int szélesség, int magasság) { this.x = x; this.y = y; this.szélesség = szélesség; this.magasság = magasság; }

13 13 / 61 ÓE-NIK, 2014 Ismétlés – példa: Téglalap osztály 2. public bool Tartalmaz(int pontX, int pontY) { return this.X <= pontX && pontX < this.X + this.Szélesség && this.Y <= pontY && pontY < this.Y + this.Magasság; } public bool Tartalmaz(Téglalap másik) { //... } Téglalap téglalap1 = new Téglalap(0, 0, 20, 40); Téglalap téglalap2 = new Téglalap(10, 10, 10, 10); Console.WriteLine(téglalap1.Tartalmaz(10, 10)); //true Console.WriteLine(téglalap2.Tartalmaz(téglalap1)); //false Console.WriteLine(téglalap1.Tartalmaz(téglalap2)); //true

14 14 / 61 ÓE-NIK, 2014 Ismétlés – példa: Téglalap osztály 3. public static Téglalap Koordinátákból(int minX, int minY, int maxX, int maxY) { return new Téglalap(minX, minY, maxX - minX, maxY – minY); } public static Téglalap Metszés(Téglalap a, Téglalap b) { int num = Math.Max(a.X, b.X); int num2 = Math.Min(a.X + a.Szélesség, b.X + b.Szélesség); int num3 = Math.Max(a.Y, b.Y); int num4 = Math.Min(a.Y + a.Magasság, b.Y + b.Magasság); return new Téglalap(num, num3, num2 - num, num4 - num3); } Téglalap téglalap1 = new Téglalap(0, 0, 20, 40); Téglalap téglalap2 = new Téglalap(10, 10, 10, 10); Téglalap metszett = Téglalap.Metszés(téglalap1, téglalap2); //eredmény: 10, 10, 10, 10

15 Osztályok és (osztály típusú) változók a memóriában

16 16 / 61 ÓE-NIK, 2014 Objektumreferencia Sok nyelvben az osztályok referenciatípusok (C# is): Az osztály típusának megfelelő változó egy referencia (mutató), amely az objektumra hivatkozik Több változó is hivatkozhat ugyanarra az objektumra Film film1; … film1 <= Film.Konstruktor(’Vasököl’, 16) … Film film2; film2 <= film1; Kiír(film1 = film2) film2 <= Film.Konstruktor(Üvegtigris’, 18) Kiír(film1 = film2) Objektumhivatkozás Ezzel nem jön létre az objektum!!! Objektumlétrehozás ‚igaz’ ‚hamis’ C#

17 17 / 61 ÓE-NIK, 2014 Objektumhivatkozás, objektumok és osztály a memóriában Film film1 Cím=‘Vasököl’ Korhatár=16 Osztályhivatkozás film2 Cím=‘Üvegtigris’ Korhatár=18 Osztályhivatkozás Objektumhivatkozás Objektumok Osztály film1 <= Film.Konstruktor(…) film2 <= Film.Konstruktor(…) MindenAdat() film1.MindenAdat() C#

18 18 / 61 ÓE-NIK, 2014 „Rejtett” paraméter A rejtett paraméter egy referencia, mely a megszólított objektum memóriacíme –(Ha osztályszintű metódust hívunk, akkor az osztály címe) Minden metódusnak ez egy rejtett paramétere és típusa maga az osztály Egy futó metódus innen tudja, hogy éppen melyik példányon dolgozik Egymásból hívott metódusok esetén automatikusan továbbadódik Működési elv: Ha film1 Film típusú, akkor a film1.GetCim() üzenetet a fordító így értelmezi: Film.GetCim(film1) Megjegyzés: Ezt az utolsó paramétert a fordító automatikusan beépíti az összes metódusba, tehát nem nekünk kell!!!

19 19 / 61 ÓE-NIK, 2014 Példa: „egyke” minta (Singleton pattern) Alapötlet: osztály, ami max. egy példányban létezik. Megj.: más nyelven is kiépíthető, az adott nyelv eszközeivel class Singleton { private Singleton() { } private static Singleton _instance; static Singleton() { _instance = new Singleton(); } public static Singleton GetInstance() { return _instance; } Singleton singleton1 = Singleton.GetInstance(); //... művelet... Singleton singleton2 = Singleton.GetInstance(); Console.WriteLine(singleton1 == singleton2); //true

20 20 / 61 ÓE-NIK, 2014 Példa: „egyke” minta (Singleton pattern) Alapötlet: osztály, ami max. egy példányban létezik. Megj.: más nyelven is kiépíthető, az adott nyelv eszközeivel class Singleton { private Singleton() { } private static Singleton _instance; public static Singleton GetInstance() { //"lusta" inicializáció if (_instance == null) { _instance = new Singleton(); } return _instance; } Singleton singleton1 = Singleton.GetInstance(); //... művelet... Singleton singleton2 = Singleton.GetInstance(); Console.WriteLine(singleton1 == singleton2); //true

21 Öröklés és többalakúság (polimorfizmus)

22 22 / 61 ÓE-NIK, 2014 Öröklődés A már meglévő osztálytípusok alapján készíthetünk új osztályokat – „örököltetés”, „leszármaztatás” –Teljes hierarchiákat is létrehozhatunk Elnevezések: „ős(osztály)”, „utód(osztály)”, „leszármazott osztály”, „származtatott osztály” –Utóbbi három megnevezés nem csak közvetlen utódokra vonatkozik A leszármazottak „öröklik” az őstípus tulajdonságait –Meglévő osztályok újrafelhasználása, kiterjesztése, (módosítása – főként polimorfizmus által) –Bővítheti, esetenként akár szűkítheti az őstípus állapotterét, illetve műveleteit –Általában specializáció a cél

23 23 / 61 ÓE-NIK, 2014 Öröklődés Általánosítás Specializálódás „is a” (angol. Magyarul: „az egy”) kapcsolat az utód és az ős közt –„Egy rombusz az egy parallelogramma.”

24 24 / 61 ÓE-NIK, 2014 Öröklődés különféle nyelvekben Az utód rendelkezik az őstípus tulajdonságaival –De nyelvtől függő, hogy pontosan mit örököl –C#: adatokat és a metódusok implementációit Egyszeres öröklésről akkor beszélünk, ha az adott nyelvben egy osztálynak csak egy őse lehet (vs. többszörös öröklés) Alaposztály: (egyszeres öröklésnél) a hierarchia legfelső osztálya

25 25 / 61 ÓE-NIK, 2014 Öröklődés példa Specializáció  generalizáció Egyenleg Bankszámla Kamat Folyószámla … értékpapírok … … értékpapír vásárlása… Értékpapírszámla Ősosztály Utódosztályok Befizet() Kifizet() Utal() … értékpapír eladása… … lekötés … … feltörés …

26 26 / 61 ÓE-NIK, 2014 Öröklődés példa Név Személy Cég KapcsolattartóSzemély BelépőkártyaSzám Dolgozó Ősosztály Utódosztályok Cím Telefon Beosztás RegisztrálBelépés() RegisztrálKilépés() JelenlétEllenőrzés()

27 27 / 61 ÓE-NIK, 2014 Öröklődés Adatok öröklése Az utódosztály példányainak adatai = ősadatok + saját adatok. Metódusok öröklése Az utódosztály metódusaiban (illetve az utódosztály példányain, külső kódból) használható bármely ősbeli metódus Mind az adatok, mind a metódusok öröklése láthatóságtól is függő!!!

28 28 / 61 ÓE-NIK, 2014 Öröklődés Egy osztály örökítésekor két lehetőségünk van: Új mező felvétele (pl. BelépőKártyaSzám) Új metódusok felvétele (pl. RegisztálKilépés()) (És meglévő metódusok felülírása – főként polimorfizmus által) Megjegyzés. Új adatok megadása új metódusok nélkül általában értelmetlen, hiszen adatot csak metódussal szabad elérni (egységbezárás), és az ősmetódusok nyilvánvalóan nem ismerhetik az újonnan deklarált adatokat

29 29 / 61 ÓE-NIK, 2014 Öröklődés AB M1()M2() Ős CD Utód Mi hajtódik végre? M3() O1:Ős A, B O2:Utód A, B, C, D Használható metódusok O1.M1() O1. M2() O2. M1() O2. M2() O2. M3() Ős.M1() Ős.M2() Ős.M1() Ős.M2() Utód.M3() Használható adatok

30 30 / 61 ÓE-NIK, 2014 Adatok és metódusok védelme 1. Objektumpéldány védelme: private/protected public Adat {Private/Protected:} Metódus Osztály Objektum: Osztály Objektum.Metódus Adat {Public:} Metódus Osztály Objektum: Osztály Objektum.Metódus

31 31 / 61 ÓE-NIK, 2014 Adatok és metódusok védelme 2. Osztály védelme örökítéskor: private public /protected Osztály.Adat Osztály.Metódus() ÚjOsztály Adat {Public/Protected:} Metódus() Osztály Osztály.Adat Osztály.Metódus() ÚjOsztály Adat { Private:} Metódus() Osztály

32 32 / 61 ÓE-NIK, 2014 Adatok és metódusok védelme 3. Összefoglalás: Public: Minden metódus használhatja akár az osztályon belül, akár öröklésen keresztül, akár külső kódból. Protected: Az osztály saját metódusai férhetnek hozzá + hozzáférés öröklésen keresztül. Private: Az osztály privát deklarációja, csak az osztály saját metódusai férhetnek hozzá.

33 33 / 61 ÓE-NIK, 2014 Polimorfizmus (többalakúság) Két teljesen különböző aspektus: –Módszer polimorfizmus: Egy leszármazott osztály egy örökölt módszert újraimplementálhat, így ugyanolyan nevű metódus hívására a leszármazási fában szereplő különböző típusú objektumok különbözőképpen reagálhatnak Metódus felülírása lehetséges De mezőt nem lehet felülírni –Objektum polimorfizmus: Minden egyes objektum szerepelhet minden olyan szituációban, ahol az ősosztály objektuma szerepelhet, nem csak a saját osztálya példányaként használható => –A leszármazott osztály példánya mindig használható ős típusú változó helyén: Változó értékadásnál Paraméterátadásnál

34 34 / 61 ÓE-NIK, 2014 Polimorfizmus AB M1()M2() Ős CD M1() Utód Mi hajtódik végre? M3() O1:Ős A, B O2:Utód A, B, C, D Használható metódusok O1.M1() O1. M2() O2. M1() O2. M2() O2. M3() Ős.M1() Ős.M2() Utód.M1() Ős.M2() Utód.M3() Használható adatok

35 35 / 61 ÓE-NIK, 2014 Polimorfizmus példa Egyenleg Bankszámla Kamat Folyószámla … értékpapírok … … értékpapír vásárlása… Értékpapírszámla Ősosztály Utódosztályok Befizet() Kifizet() Utal() … értékpapír eladása… … lekötés … … feltörés … Utal() Kifizet() Utal() Kifizet() Őshöz képest más viselkedést definiálnak! Bankszámla számlám = new ÉrtékpapírSzámla(); //... használat... számlám.Utal(100000, " ");

36 36 / 61 ÓE-NIK, 2014 Polimorfizmus Futásidejű kötés: –Ha egy adott osztályhierarchiában (leszármazási fán) egy adott függvény különböző verziói létezhetnek, –ÉS egy ős típusú változó elképzelhető, hogy valamilyen utód típusú példányt tartalmaz, –Melyik „verziót” hívjuk meg az adott függvényből? –Csak a futás során derül ki, hogy konkrétan melyikre van szükség. Közvetlenül a híváskor a hívó és a hívott függvény futás közbeni összerendelését nevezzük futásidejű kötésnek Megvalósítása nyelvenként különböző

37 37 / 61 ÓE-NIK, 2014 Futásidejű kötés infrastruktúrája (C#) Folyószámla értékpapírszámla1 Egyenleg= Kamat=0.18 Osztályhivatkozás folyószámla1 Egyenleg=500 Értékpapírok=… Osztályhivatkozás ObjektumhivatkozásOsztály Értékpapírszámla Befizet() Utal() Kifizet() Befizet() Utal() Kifizet() C#

38 38 / 61 ÓE-NIK, 2014 Futásidejű kötés infrastruktúrája (C#) Bankszámla ?számla1 (Bankszámla típusú változóban pl Értékpapírszámla változó) Egyenleg=500 Értékpapírok=… Osztályhivatkozás ObjektumhivatkozásOsztály Értékpapírszámla Befizet() Utal() Kifizet() Befizet() Utal() Kifizet() C#

39 39 / 61 ÓE-NIK, 2014 Példa: többalakúság egyszerű alkalmazása Munkahelyi nyilvántartó rendszerünkben küldhetünk e- mailt egy tetszőleges személynek. Nem kell megszabni, hogy a címzett Dolgozó vagy Kapcsolattartó legyen. (Mindkettőnek van -címe – Személyből öröklik) static void tKüld(Személy címzett, string üzenet) { string ideküldöm = címzett. ; //... } //... Dolgozó főnök; //... //... használat... tKüld(főnök, „…");

40 40 / 61 ÓE-NIK, 2014 Példa: többalakúság egyszerű alkalmazása Banki nyilvántartó rendszerünkben egy embernek több bankszámlája is lehet. Nem szükséges fajtánként külön tárolni, közös tömbben is elhelyezhetjük őket. Bankszámla[] bankszámlák; //... bankszámlák[1] = new ÉrtékpapírSzámla(); //... bankszámlák[6] = new Folyószámla();

41 41 / 61 ÓE-NIK, 2014 Többalakúság összetettebb alkalmazása Egyenleg Bankszámla … új mezők Folyószámla … új mezők … új metódusok Értékpapírszámla Befizet() Kifizet() Utal() … új metódusok Megszüntet() Utal() Kifizet() Utal() Kifizet() Megszüntet() függvény implementációja: … Ha van a banknak tartozás… Utal(tartozásÖsszege, bankSzámlaszáma); … Ha van az adóhatóságnak tartozás… Utal(tartozásÖsszege2, navSzámlaszáma); Kifizet(maradék) ÉrtékpapírSzámla értékpapírSzámla; Folyószámla folyószámla; //... értékpapírSzámla.Megszüntet(); folyószámla.Megszüntet(); Utal(tartozásÖsszege, bankSzámlaszáma); Utal(tartozásÖsszege2, navSzámlaszáma); Kifizet(maradék)

42 42 / 61 ÓE-NIK, 2014 Példa: „stratégia” minta (Strategy pattern) TermékLista lista = new TermékLista(); //... használat... lista.Rendez(new BuborékRendezés()); Rendez(objektumok) RendezésiStratégia (ős) Rendez(objektumok) BuborékRendezés (utód) Rendez(objektumok) GyorsRendezés (utód) TermékLista objektumok Rendez(rendezésiStratégia) public void Rendez(RendezésiStratégia rendezesiStrategia) { rendezesiStrategia.Rendez(objektumok); } Alapötlet: algoritmusok egy családját reprezentáljuk osztályok formájában. A felhasználó osztályban felcserélhetők.

43 OOP alapelvek 43/104

44 44 / 61 ÓE-NIK, alapelv: absztrakció Meghatározzuk a szoftverrendszer absztrakt elemeit Meghatározzuk az elemek állapotterét –Adatelemek Meghatározzuk az elemek viselkedésmódját –Funkciók végrehajtása –Állapotváltoztatások Meghatározzuk az elemek közötti kapcsolattartás felületeit és protokollját Az osztály mindig az adott feladatban fontos tulajdonságokat/képességeket tartalmazza. Oka: egyszerűsítés Eszközrendszere: class definíció

45 45 / 61 ÓE-NIK, alapelv: egységbezárás Az objektumok adatait és a rajtuk végezhető műveleteket szoros egységbe zárjuk –Pontosan definiáljuk az adatok eléréséhez/használatához szükséges műveleteket –Elvileg az adatok csak ezek segítségével érhetők el, és más műveletek az objektummal nem végezhetők Meghatározott feladatot ellátó, „öntartalmazó” egységként kezeljük őket Oka: –Átláthatóság –Újrafelhasználhatóság –Adatok fizikailag közel vannak a rajtuk dolgozó műveletekhez, ami a módosíthatóságot segíti Eszközrendszere: class definícióban adatok+műveletek

46 46 / 61 ÓE-NIK, alapelv – adatrejtés Pontosan meghatározzuk az osztály kifelé való „kapcsolódási pontjait” –Az objektumokon belül elkülönítjük a belső (privát) és a külső (nyilvános) adatokat és műveleteket –A belső használatú műveletek privátok –A nyilvános adatok és műveletek a szoftverrendszer többi objektuma számára (is) elérhetők Tájékozódás az objektum állapotáról Az objektum állapotának módosítása Oka: –Pontos megvalósítás, pontos adatábrázolás elrejtése –Az objektum rejtett része meghatározza a szabadon módosítható részeket –Az adatelérés kontrollálása véd a hibáktól Eszközrendszere: láthatóságok, tulajdonságok getter/setter metódusai (még publikus esetben is)

47 47 / 61 ÓE-NIK, alapelv: öröklés A már meglévő osztálytípusok alapján készíthetünk új típusokat, melyek rendelkeznek az őstípus tulajdonságaival –Ez egy specializációs művelet („származtatás”) A leszármazottak öröklik az őstípus tulajdonságait –A leszármazottak bővíthetik, esetenként akár szűkíthetik az őstípus állapotterét, illetve műveleteit –Teljes leszármazási hierarchiákat is létrehozhatunk Oka: –Kódújrafelhasználás –(osztályok közötti logikai kapcsolat fizikai megjelenítése) Eszközrendszere (polimorfizmussal együtt): ősosztály megadása, virtuális/absztrakt metódusok, absztrakt osztályok, interfészek megvalósítása/kiterjesztése (a prog II-n fogják tárgyalni)

48 48 / 61 ÓE-NIK, alapelv: többalakúság/polimorfizmus A különböző, egymásból származó objektumtípusok azonos megnevezésű műveletei a konkrét objektumtól függően más- más konkrét megvalósítással rendelkezhetnek –Ugyanazt a műveletet eltérő módon végezheti az őstípus és a leszármazott –Az alapelv lehetőséget teremt rá, hogy azonos névvel hivatkozzunk az azonos célú, de a leszármazási hierarchia különböző szintjein más-más megvalósítást kívánó műveletekre Az egyes őstípusok leszármazottai mindenre alkalmasak, amire az adott őstípus alkalmas volt –Minden olyan helyzetben és funkcióban, ahol az őstípus szerepelhet, annak bármely leszármazottja is szerepelhet Oka: –Módszerpolimorfizmus: kódújrafelhasználás különféle formái (bővítés lehetősége egy már létező funkcionalitás megtartása mellett – lásd „többalakúság összetettebb alkalmazása” példánkat) –Objektumpolimorfizmus: módosításokkal szembeni rugalmasság, szabad bővítés újabb objektumfajtákkal… stb.

49 49 / 61 ÓE-NIK, alapelv: kódújrafelhasználás A korábban említett alapelvek mentén valósul meg Absztrakció, egységbezárás, adatrejtés segítségével –Konkrét feladatot ellátó, jól tervezett, biztonságosan használható osztály átvihető más programba –Akár bináris formában (könyvtárak (libraryk), komponensgyűjtemények) Örökléssel –Adatokat és műveleteket nem kell újra megírni Polimorfizmussal –Meglévő implementáció kiegészítését végezhetjük el úgy, hogy a régi implementáció nem módosul Felülírt függvények segítségével („többalakúság összetettebb alkalmazása” példánkban) Vagy eleve általánosra megírt függvények elfogadnak újabb létrehozott osztályokat is („többalakúság egyszerűbb alkalmazása” példáinkban)

50 OOP modellezés 50/104

51 51 / 61 ÓE-NIK, 2014 Bevezető fogalmak Absztrakció lat. 1. elvonatkoztatás, elvonás; a leglényegesebb tulajdonságok kiemelése és általánosítása; 2. elvont fogalom [Idegen szavak és kifejezések szótára, Akadémiai Kiadó]

52 52 / 61 ÓE-NIK, 2014 Programkészítés Absztrakciós folyamat, amelyben a valós világban létező jelenséget (megoldandó problémát) valamilyen programozási eszköz absztrakciós szintjén képzünk le A munka nehézsége függ –a leképezendő jelenség/folyamat bonyolultságától (komplexitásától) –a valóság és a programozási eszköz absztrakciós szintjének különbözőségétől

53 53 / 61 ÓE-NIK, 2014 Programozási nyelvek A programozási eszközök absztrakciós szintjei különbözőek: Assembly: adott számítógép-architektúra utasításkészletének leképezése Strukturált/procedurális programnyelvek: adatszerkezetek és algoritmusok absztrakciós szintje –a valós világ fogalmaihoz nem közeli Objektumorientált nyelvek: együttműködő objektumok absztrakciós szintje –A valóságban is léteznek

54 54 / 61 ÓE-NIK, 2014 Programozás mint modellkészítés Program: a valós világ egy szeletének működő modellje Ebben a szemléletben a valós világ absztrakt modelljét (analízis modell) kell leképezni a programozási eszközre OOP szemlélet szerint az analízis modell elkészítése során a valóságot objektumok halmazaként tekintjük. Ezen objektumok egymással kapcsolatban vannak és együttműködnek

55 55 / 61 ÓE-NIK, 2014 Objektumtól objektumig A valós világ eleme Absztrakció Nyelvi elem Valós objektumok Absztrakt adattípus Osztály Objektum1 Megvalósítása programozási eszközzel (implementáció) Objektum3Objektum2 Absztrakció és/vagy formális leírás Példányosítás 1. szint 2. szint 3. szint

56 56 / 61 ÓE-NIK, 2014 Objektumtól objektumig 1. szint Tanulmányozzuk a valós objektumokat, és megkeressük azoknak a probléma megoldása szempontjából fontos adatait és viselkedésmintáit. (Az absztrakció fogalmából: „A leglényegesebb tulajdonságok kiemelése”) Megkeressük azon objektumcsoportokat, amelyek azonos adatokkal és viselkedésmintákkal rendelkeznek, és elnevezzük ezeket a csoportokat. (Az absztrakció fogalmából: „általánosítás”)

57 57 / 61 ÓE-NIK, 2014 Objektumtól objektumig A valós világ eleme Absztrakció Nyelvi elem Valós objektumok Absztrakt adattípus Osztály Objektum1 Megvalósítása programozási eszközzel (implementáció) Objektum3Objektum2 Absztrakció és/vagy formális leírás Példányosítás 1. szint 2. szint 3. szint

58 58 / 61 ÓE-NIK, 2014 Objektumtól objektumig 2. szint Az előzőleg definiált fogalom leképzése a programozási eszközre (osztálydefiníció). Ez egy minta a program működéséhez szükséges objektumok létrehozására

59 59 / 61 ÓE-NIK, 2014 Objektumtól objektumig A valós világ eleme Absztrakció Nyelvi elem Valós objektumok Absztrakt adattípus Osztály Objektum1 Megvalósítása programozási eszközzel (implementáció) Objektum3Objektum2 Absztrakció és/vagy formális leírás Példányosítás 1. szint 2. szint 3. szint

60 60 / 61 ÓE-NIK, 2014 Objektumtól objektumig 3. szint Akkor és annyi objektumot kell létrehozni a program futása során, amelyek együttműködve képesek a valóságot modellezni.

61 61 / 61 ÓE-NIK, 2014 OOP programkészítés „algoritmus” 1. Problémaanalízis –Reprezentálandó információ (információtípus! Nem konkrét információdarab) és ahhoz kapcsolódó műveletek, illetve akár elvégzendő feladatok azonosítása a specifikációból Hierarchiáik azonosítása (öröklési célból) –Kimenet: az információt és/vagy akár az elvégzendő feladatokat reprezentáló osztályok nevei és rövid leírásuk Osztályok tervezése –A műveletek reprezentálásához: Műveletek formájában fejezzük ki az osztályok összes tevékenységét –Az adat reprezentálásához: Primitív típust választunk, ha azzal az adat maradéktalanul reprezentálható. Többnyire új osztályt készítünk, ha egy reprezentálandó információ több „információdarabot” foglal magába. Adott osztály tartalmazhat/használhat példányt egy másik osztályból, ha az osztályban reprezentálandó információ egy része a másik osztály példányával kifejezhető (Megj: adott osztály használhat példányt akár ugyanabból az osztályból is.) Terv kipróbálása példákkal

62 62 / 61 ÓE-NIK, 2014 OOP programkészítés „algoritmus” 2. Implementáció Létrehozunk megfelelő példányokat (objektumokat) a megfelelő időben, és megoldjuk a kommunikációjukat Adott feladathoz szükségünk lehet az eredeti probléma objektumain túl technikai szerepű osztályokra/objektumokra is

63 63 / 61 ÓE-NIK, 2014 Objektumkapcsolatok – Asszociáció „Adott osztály tartalmazhat/használhat egy példányt egy másik osztályból” Asszociációnak nevezzük, ha két osztály (objektumai) tetszőleges kapcsolatban vannak egymással. –„A bankban számlák nyithatók” –„A tanár a szerzője a könyvnek” –„A diák fel tud iratkozni a kurzusra” –„A megrendelés adatai az adatbáziskapcsolaton keresztül mentődnek” –„A neptunban létrehozhatók vizsgaalkalmak” Rengeteg formában megjelenhet, de két fontos speciális esete van: kompozíció, aggregáció

64 64 / 61 ÓE-NIK, 2014 Objektumkapcsolatok – Kompozíció Speciális asszociáció: „has a” kapcsolat (angol. Magyarul: „van egy”) –„A bankszámlában tárolva vannak a forgalmi adatok” class Tranzakció { DateTime dátum; int összeg; //... } class Bankszámla { Tranzakció[] tranzakciók; //... }

65 65 / 61 ÓE-NIK, 2014 Kompozíció Kvíz Kérdések = {... } Kvíz k LehetségesVálaszDb=1 KvízKérdés kérdés VálaszSzöveg=‚... ’ VálaszLehetőség v1 Értékel() Választ(VálaszLehetőség) KérdésSzöveg=‚... ’ CsatoltKép=... VálaszLehetőségek={... } HelyesVálaszok={... } KiválasztottVálaszok={... }

66 66 / 61 ÓE-NIK, 2014 Kompozíció Játékpálya/labirintus Szörnyek={... } Labirintus l Akadályok= {... } PozícióX=0 PozícióY=8 Akadály akadály1 PozícióX=0 PozícióY=9 Szörny szörny1 Mozog() Életerő=100

67 67 / 61 ÓE-NIK, 2014 Objektumkapcsolatok – Aggregáció Speciális asszociáció: „has a” kapcsolat (angol. Magyarul: „van egy”) A kompozíciótól abban különbözik, hogy a tartalmazott példány(ok) élettartama nem kötődik a tartalmazóéhoz –„A bankszámlának van egy tulajdonosa” class Bankszámla { Személy tulajdonos; //... }

68 68 / 61 ÓE-NIK, 2014 Aggregáció Adatbázis-kapcsolat Szerver=’...’ Felhasználó=’...’ DBKapcsolat k Jelszó=’...’ Kapcsolódik() KapcsolatBontása() ParancsotGenerál() Port=’...’ Kapcsolat=k ParancsSzöveg=’select...’ DBParancs parancs1 Végrehajt() ParancsMaxIdőMs=200 Kapcsolat=k ParancsSzöveg=’update...’ DBParancs parancs2 Végrehajt() ParancsMaxIdőMs=∞

69 Névterek

70 70 / 61 ÓE-NIK, 2014 Névterek 1. Az OO paradigma jellemzője az elnevezések óriási száma –Minden osztálynak, objektumnak, mezőnek, metódusnak egyedi nevet kell adni, hogy a későbbiekben hivatkozni lehessen rájuk Nem könnyű jól megjegyezhető, a célt később is felidéző neveket adni A programok méretével egyenes arányban nő a névütközések valószínűsége – A programok általában nem csak saját osztályokat használnak fel

71 71 / 61 ÓE-NIK, 2014 Névterek 2. A névtér, mint az elnevezések érvényességének tartománya, hierarchikus logikai csoportokra bontja az elnevezéseket –Minden elnevezésre csak a saját névterén belül lehet hivatkozni – külön jelzés nélkül –Ennek megfelelően a saját névterén belül minden elnevezés egyedi –A névterek általában tetszőleges mélységben egymásba ágyazhatók –Azonos elnevezések más-más névtereken belül szabadon használhatók, így erősen lecsökken a névütközési probléma jelentősége

72 72 / 61 ÓE-NIK, 2014 Névterek - példa

73 73 / 61 ÓE-NIK, 2014 Névterek A névterek az elnevezések tetszőleges logikai csoportosítását teszik lehetővé –Nincs közük a fizikai tároláshoz (fájlokhoz és mappákhoz) Egy fájlban több névtér, egy névtér több fájlban is elhelyezhető –Tetszőlegesen egymásba ágyazhatók A beágyazott névterek tagjait a „. ” karakterrel választhatjuk el –A névtérbe be nem sorolt elemek egy ún. globális névtérbe kerülnek –A névterek nevének Microsoft által javasolt formátuma:.( | )[. ][. ] namespace A { namespace B { class Egyik {…} } … A.B.Egyik példa = new A.B.Egyik(); namespace A.B { class Másik {…} } namespace C { class Harmadik {…} } … A.B.Másik példa2 = new A.B.Másik(); C.Harmadik példa3 = new C.Harmadik(); C#

74 74 / 61 ÓE-NIK, 2014 Névterek Minden névre a saját névterével együtt kell hivatkozni –Ez az ún. teljesen minősített név (fully qualified name), formája: névtér.alnévtér.alnévtér(...).elnevezés A névterek hivatkozás céljára előkészíthetők a using kulcsszó segítségével –Ezt követően az adott névtérben található elnevezések elé hivatkozáskor nem kell kiírni a névteret, feltéve, hogy az elnevezés így is egyértelműen azonosítható A névtereknek álnév is adható –Célja a hosszú névterek egyértelmű rövidítése using System; using System.Text; using System; using SOAP = System.Runtime.Serialization.Formatters.Soap;... SOAP.SoapFormatter formazo = new SOAP.SoapFormatter(); Console.WriteLine(formazo); System.Console.WriteLine(); System.Threading.Thread.Sleep(100); pi = System.Math.PI; C#


Letölteni ppt "Programozás I. Objektumorientált paradigma II. Osztályok és objektumok a memóriában Öröklés és többalakúság OOP alapelvek OOP modellezés."

Hasonló előadás


Google Hirdetések