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. 2 / 52 ÓE-NIK, 2014 Programozástörténelem Első számítógép (ENIAC): 1946 –A programot kapcsolótáblán kellett.

Hasonló előadás


Az előadások a következő témára: "Programozás I. Objektumorientált paradigma. 2 / 52 ÓE-NIK, 2014 Programozástörténelem Első számítógép (ENIAC): 1946 –A programot kapcsolótáblán kellett."— Előadás másolata:

1 Programozás I. Objektumorientált paradigma

2 2 / 52 ÓE-NIK, 2014 Programozástörténelem Első számítógép (ENIAC): 1946 –A programot kapcsolótáblán kellett beállítani Első Neumann-elvű gép (EDVAC): 1948 –Ennek a tervei alapján készültek az első tárolt programú gépek „Szoftverfejlesztés” kezdete: ~1955 –Ebben az időben már léteztek és terjedtek „általános célú” gépek –Kutatók programoztak –Assembly: alacsonyszintű programozási nyelv, specifikus egy adott architektúrához: rövid utasításokból áll, amelyek kb. a processzor utasításkészletét képezik le. Korai Assembly nyelvekben a leképezés 1-1-es. Pentium gépi kód: tegyünk nyolcbites értéket a BL regiszterbe: xxxxxxxx, pl: –Assembly: MOV BL, 055H

3 3 / 52 ÓE-NIK, 2014 Assembly nyelvű program – részlet Ez késői (fejlettebb) assembly Nincsenek fejlett nyelvi szerkezetek –Néhány kisebb könnyítést biztosít az assembly „fordító” section.text global _start _start: movedx,len movecx,msg movebx,1 moveax,4 int0x80 moveax,1 int0x80 section.data msg db 'Hello, world!', 0xa len equ $ - msg

4 4 / 52 ÓE-NIK, 2014 Programozástörténelem ~1960-: Harmadik generációs számítógépek –Nagyobb erőforráskészlet → bonyolultabb problémák → nagyobb, bonyolultabb programok iránti igény –Felhasználói kör megváltozása → igények változása: –A szoftverfejlesztő a kívülről látható és mérhető minőséget csak egy belső rend felállításával érheti el. Ezért a belső minőség kialakítása állandó törekvés. Átláthatóság Általánosság/”szépség” Módosíthatóság Újrafelhasználhatóság Egyéniségfüggetlenség –Kis számítási igény –Kis memóriaigény ⁺Helyesség ⁺Megbízhatóság ⁺Felhasználóbarátság ⁺Alkalmazkodóképesség

5 5 / 52 ÓE-NIK, 2014 Programozástörténelem A minőséget egyre kevésbé lehetett tartani a korai eszközök, módszerek alkalmazásával: 60-as évek végén „SZOFTVERKRÍZIS” (bővebben lásd Szoftvertechnológia előadáson) 1968:  Programozási paradigmák és eszközök fejlesztése  Szoftverfejlesztési metodikák fejlesztése (bővebben lásd Szoftvertechnológia előadáson) Paradigma: gör-lat 1. bizonyításra v. összehasonlításra adott példa 2. nyelvt ragozási minta 3. tud Az adott korszakban elfogadott tudományos tételek együttese; a kor tudományos világképe. [Bakos Ferenc szerk.: Idegen szavak és kifejezések szótára, Akadémiai Kiadó, második, átdolgozott kiadás, 2002]

6 6 / 52 ÓE-NIK, 2014 Programozási paradigmák – strukturált programozás Strukturált vezérlési szerkezetek használata egyszerű tesztelések és ugrások helyett Dijkstra: Go To Statement Considered Harmful (1968) –Dijkstra: Go To Statement Considered Harmful (1968) Böhm, Jacopini: strukturált program tétel (1966) –Minden algoritmus leírható három vezérlési szerkezet (szekvencia, szelekció, iteráció) segítségével Már léteztek/megjelentek megfelelő vezérlési szerkezeteket tartalmazó programnyelvek (ALGOL 1958, PL/I 1964, Pascal 1970)

7 7 / 52 ÓE-NIK, 2014 Programozási paradigmák – procedurális/moduláris programozás A program „procedúrákból” (rutin, szubrutin, függvény, metódus…) áll –Egy ún. „főprogram” fogja össze, amely függvényeket „hív meg” –A főprogram komoly szerepet játszik és gyakran igen bonyolult –A függvények definíciója határozza meg a programszerkezetet –A végrehajtás menetét szigorúan megszabja a megírt programkód –Globális adatstruktúrákkal dolgozik –Top-down jellegű feladatlebontás Pascal 1970, C 1973

8 8 / 52 ÓE-NIK, 2014 Programozási paradigmák – procedurális/moduláris programozás

9 9 / 52 ÓE-NIK, 2014 Programozási paradigmák – objektumorientált programozás –Az adatokon végzett műveletek implementációja nagyon erősen függ a választott adatszerkezettől! Az adatokat és a rajtuk végezhető műveleteket szoros egységbe fogva, „osztályokkal” definiáljuk a program képességeit A program konkrét szereplői „objektumok”, minden objektum egy osztályhoz tartozik (osztály példánya), az osztály által definiált adatokat tartalmazza és azokkal az osztály által megadott műveleteket képes elvégezni –Az objektumok magukban foglalják az algoritmusokat Minden objektum a probléma egy részét írja le és magában foglalja a részfeladat megoldásához tartozó algoritmikus elemeket –Az objektumok munkája és kommunikációja során képződik a megoldás –A főprogram jelentősége igen csekély Gyakorlatilag csak indítási pontként szolgál (objektumokat hozunk létre benne) Simula ; C , Java 1995, C# 2000

10 10 / 52 ÓE-NIK, 2014 Programozási paradigmák – objektumorientált programozás OOP térnyerése: nagy projektek, csapatmunka –Átláthatóság, olvashatóság, karbantarthatóság: a program szereplői konkrét „valós világbeli” objektumok vagy folyamatok/műveletek absztrakciói –Adatok és műveletek egy egységbe zárása miatt a módosítások egy részét jól tűri –Adatrejtési mechanizmusok (később) segítségével támogatja a hibák elkerülését, módosításokat –Jól tervezett osztályok könnyen újrafelhasználhatók, öröklés és/vagy polimorfizmus segítségével funkcionalitásukban bővíthetők (később) OOP alapelvek: absztrakció, egységbezárás, adatrejtés, kódújrafelhasználás, öröklés*, polimorfizmus* (később) *: Az öröklést és polimorfizmust érdemileg a Programozás II-ben érintjük

11 11 / 52 ÓE-NIK, 2014 Példa procedurális megoldásra* Feladat: –Hány különböző elem van egy adott tömbben? –Feltételezzük, hogy a tömb pozitív egészeket tartalmaz Terv: –Tömb feltöltése és kiírása –Számlálás: végignézzük a tömb elemeit, és ha egy elem korábban még nem fordult elő (ehhez keresni kell őt a tömb korábbi elemei között), akkor megszámoljuk –Eredmény megjelenítése *: Gregorics Tibor (ELTE IK) mintapéldája alapján

12 12 / 52 ÓE-NIK, 2014 Példa procedurális megoldásra* Implementálás: –Négy függvényt készítünk a Main() függvényen kívül: Feltölt(), Kiír(), KülönbözőtSzámlál(), Eldöntés() –A tömböt mint központi adatot globális változóként definiáljuk –A Main() függvény hívja a Feltölt(), Kiír(), KülönbözőtSzámlál() függvényeket, az utóbbi hívja az Eldöntés()-t. –Inputellenőrzésre Olvas() függvényt is készítünk. *: Gregorics Tibor (ELTE IK) mintapéldája alapján

13 13 / 52 ÓE-NIK, 2014 Példa OO jellegű megoldásra* Feladat: –Hány különböző elem van egy adott tömbben? –Feltételezzük, hogy a tömb pozitív egészeket tartalmaz Terv: –Input-output kezelésre osztály –Halmazt reprezentáló osztály: Az eredeti tömb értékei, mint indexek alapján egy reprezentatív tömbben vizsgáljuk, hogy az elem már szerepel-e? Inicializálás Halmazméret visszaadás –Vezérlő osztály: indítás, vezérlés *: Gregorics Tibor (ELTE IK) mintapéldája alapján

14 Programozás I. OOP alapfogalmak

15 15 / 52 ÓE-NIK, 2014 Osztály vs. objektum Az osztály definiálja azokat a „tulajdonságokat és képességeket”, amelyeket az adott osztályba tartozó összes objektum birtokol –Az osztályleírás így egyfajta sablont ad az objektumokhoz –Tartalmazza, hogy az objektumok hogyan jönnek létre és hogyan semmisülnek meg, milyen adatokat tartalmaz egy objektum, és ez az adat milyen módon manipulálható Az objektum egy, az osztályleírás alapján létrejött diszkrét entitás –Minden objektum valamilyen létező osztályba tartozik (=adott osztály példánya), egy osztályból több objektum is lehet –Az osztály által meghatározott adatokat tartalmazza –A benne tárolt adatok felhasználásával feladatokat hajt végre és más objektumokkal kommunikál

16 16 / 52 ÓE-NIK, 2014 Osztály vs. objektum „Személy” osztály: –„A személynek van neve” –„A személynek van címe” –„A személynek van telefonszáma” Név=‘Első Egon’ Cím=‘1043 Budapest, István út 60’ Személy személy1 Telefonszám=‘ ’ Név=‘Második Miksa’ Cím=‘1034 Budapest, Bécsi út 100’ Személy személy2 Telefonszám=‘ Név= ‘Harmadik Helga’ Cím=‘7635 Pécs, Ágota utca 1’ Személy személy3 Telefonszám=‘ ’

17 17 / 52 ÓE-NIK, 2014 Osztály vs. objektum „Film” osztály: –„A filmnek van címe” –„A filmnek van hossza (percben)” –„A filmnek van formátuma” –„A filmet át lehet konvertálni más formátumúvá” Cím=‘A remény rabjai’ Hossz=142 Film film1 Formátum=‘wmv9’ Konvertál() Cím=‘A keresztapa’ Hossz=175 Film film2 Formátum=‘mpeg4’ Konvertál()

18 18 / 52 ÓE-NIK, 2014 Objektum – állapotok, viselkedés és azonosság Az objektum állapotát az általa tárolt adatok aktuális értéke határozza meg –Az objektum állapota az elvégzett műveletek hatására megváltozhat –Két objektum állapota megegyezik, hogyha a tárolt különféle adatok értékei a két objektumban megegyeznek Minden objektum önállóan működő entitás –Az egyes objektumok létrehozásuk pillanatában azonos állapotúak, utána önállóan működnek tovább Minden objektum egyértelműen azonosítható a memóriacímével –Ha két objektum állapota megegyezik, maguk az objektumok akkor sem azonosak

19 19 / 52 ÓE-NIK, 2014 Elnevezések „Objektum”: objektum, példány, objektumpéldány „Objektum létrehozása az osztályleírás alapján”: példányosítás „Objektumban tárolt adat”: mező –Változók formájában adjuk meg őket az osztályleírásban (tagváltozó, adattag) –Variációk pl.: tulajdonságok „Objektum képessége”: metódus –Függvények/metódusok formájában adjuk meg őket (tagfüggvény, metódus) –Speciális célú metódusoknak külön neve van (konstruktor, destruktor, operátor, indexer, getter, setter, …) Metódusok+mezők: tagok

20 20 / 52 ÓE-NIK, 2014 Osztály C#-ban class Naplo { string fajlNev; public Naplo(string fajlNev) { this.fajlNev = fajlNev; } public void Beir(string uzenet) { StreamWriter writer = new StreamWriter(fajlNev); writer.WriteLine(uzenet); writer.Close(); } „Objektumban tárolt adat” „Objektum képességei”

21 21 / 52 ÓE-NIK, 2014 Osztály C++ nyelven #include using namespace std; class Naplo { private: string fajlNev; public: void Naplo(string fajlNev) { this->fajlNev = fajlNev; } void Beir(string uzenet) { ofstream writer( fajlNev ); if (writer) { writer << uzenet << endl; writer.close(); } }; „Objektumban tárolt adat” „Objektum képességei”

22 22 / 52 ÓE-NIK, 2014 Osztály Matlab nyelven classdef Naplo < handle properties FajlNev end methods function obj = Naplo(fajlNev) obj.FajlNev = fajlNev; end function obj = Beir(obj, uzenet) fileID = fopen(obj.FajlNev,'w'); fprintf(fileID,uzenet); fclose(fileID); end „Objektumban tárolt adat” „Objektum képességei”

23 23 / 52 ÓE-NIK, 2014 Osztály Python nyelven class Naplo: def __init__(self, fajlNev): self.fajlNev = fajlNev def Beir(self, uzenet): f = open(self.fajlNev, 'w') f.write(uzenet + '\n') f.close() „Objektumban tárolt adat” „Objektum képességei”

24 24 / 52 ÓE-NIK, 2014 Metódusok speciális típusai Objektum létrehozása: konstruktor Ahhoz, hogy az objektumokat használhassuk, először létre kell hozni őket. Ez a példányosítás –Alapja az osztály megadott definíciója –A példányosítást követően érhetők el az objektumhoz tartozó metódusok és a mezőinek értéke A konstruktor objektumpéldányokat hoz létre –Feladatai: Új objektum létrehozása Az objektumhoz tartozó mezők kívánt kezdőértékének beállítása Egyéb szükséges kezdeti műveletek végrehajtása Minden osztályhoz tartoznia kell konstruktornak –Sokszor automatikusan létrejön

25 25 / 52 ÓE-NIK, 2014 Metódusok speciális típusai Objektum megszüntetése: destruktor Az objektumokat az utolsó használat után fel kell számolni, a destruktor az ezt végző metódus –Minden objektum önállóan létezik, ezért külön-külön szüntethető meg Az objektumok felszámolása lehet a programozó feladata vagy történhet automatikusan is –Egy objektum akkor számolható fel automatikusan, ha a későbbiekben már biztosan nincs rá szükség –Az automatikus felszámolás (szemétgyűjtés: GC) fejlettebb és jóval kevésbé hibaérzékeny megoldás –Automatikus felszámolás esetén nincs feltétlenül szükség destruktorra

26 26 / 52 ÓE-NIK, 2014 Metódusok speciális típusai Módosító metódusok (setter) –Megváltoztatják az objektum állapotát Kiolvasó metódusok (getter) –Hozzáférést biztosít az objektum adataihoz, de nem változtatják meg őket (így az objektum állapotát sem) Iterációs metódusok –Az objektum adatainak valamely részhalmazán „lépkednek végig”, és arra vonatkozóan végeznek el műveleteket Indexelők –Az objektum adatai valamely részhalmazának indexelt elérését biztosítják Operátorok –Az objektumokkal egyszerű műveleteknek (+, -, *, /, …) az adott osztály kontextusában értelmezett elvégzését támogatják

27 27 / 52 ÓE-NIK, 2014 Tulajdonságok A tulajdonság felfogható intelligens mezőként Írási és olvasási műveletéhez egy-egy metódus tartozik (getter, setter) –Ezek segítségével a tulajdonságot tartalmazó osztály kontrollálhatja, hogy mi történjen a tulajdonság írásakor, olvasásakor Nyelvtől függően az előzőekben említett speciális metódusokon és mezőkön kívül még mások is előfordulhatnak az osztályleírásban A konkrét működési mechanizmus is nyelvenként különbözhet

28 28 / 52 ÓE-NIK, 2014 Példányszintű tagok 1. 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 A példányszintű mezők tárolják a példányok állapotát

29 29 / 52 ÓE-NIK, 2014 Példányszintű tagok 2. A metódusok kódját nem tartalmazza külön-külön az osztály minden példánya –A metódusok minden példánynál azonosak és nem módosíthatók, ezért a metódusok programkódját az osztályon belül szokás tárolni –Szükséges lehet, hogy a példányszintű metódusok hivatkozni tudjanak arra az objektumra, amelyen a műveletet végzik Példa: átadás paraméterként vagy eredményként; elnevezések egyértelműsítése –Ezt általában egy rejtett paraméterrel valósítják meg Megnevezése nyelvenként változik („this”, „Self”, „Me”...) Mindig minden példánymetódusból elérhető, értéke a példány referenciája maga

30 30 / 52 ÓE-NIK, 2014 Osztályszintű tagok 1. 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ó Osztályszintű adatmezők –Minden osztály pontosan egyet tartalmaz belőlük, függetlenül az osztályból létrehozott objektumpéldányok számától

31 31 / 52 ÓE-NIK, 2014 Osztályszintű tagok 2. Osztályszintű metódusok –Akkor is elérhetők, ha az osztályból egyetlen objektum sem lett példányosítva –Konkrét példányt nem igénylő feladatok végrehajtására alkalmasak Példa: konverziós függvényeknél ne kelljen példányt létrehozni Példa: operátorok Példa: főprogram megvalósítása, io kezelés –Speciális osztályszintű metódus az osztályszintű konstruktor Feladata az osztályszintű adatmezők kezdőértékének beállítása

32 32 / 52 ÓE-NIK, 2014 Osztály- és példányszintű tagok

33 33 / 52 ÓE-NIK, 2014 Láthatóságok (előzetes) Az osztályok minden tagjához (mezőhöz, metódushoz) láthatósági szint van rendelve A láthatósági szint azt befolyásolja, hogy az adott tag honnan elérhető –Bárhonnan –Vagy csak az osztályon belülről lehet rá hivatkozni –A legtöbb nyelv további szinteket is definiál (adott osztályból és utódosztályokból elérhető, adott programon belülről elérhető… stb.)

34 Programozás I. Objektumorientáltság alapjai C#-ban

35 35 / 52 ÓE-NIK, 2014 Osztályok deklarálása Az osztályok deklarálása a class kulcsszó segítségével történik –Az osztályok deklarációja tartalmazza az összes tag leírását és a metódusok megvalósítását C# class Példaosztály { // Itt kell deklarálnunk az osztály összes tagját (mezőket, metódusokat… ) // A metódusok konkrét megvalósítását szintén itt kell megadnunk }

36 36 / 52 ÓE-NIK, 2014 Adattagok Az adattagok értéke a deklarációval egyszerre, helyben is megadható (inicializálás) Az adattagok lehetnek –Olvasható-írható adattagok Értékük tetszés szerint olvasható és módosítható az osztály függvényei által Kívülről a láthatóság függvényében –Csak olvasható adattagok Értékük futásidőben áll be, konstruktorban vagy helybeni inicializációval Utána nem módosíthatók – Konstans adattagok Értéküket a fordítóprogram előre letárolja, futásidőben nem módosíthatók string jegy = "jeles"; int j = -10; readonly string SosemVáltozomMeg = "I Will Stay The Same"; const double π = ; const int összeg = 23 * ( ); C#

37 37 / 52 ÓE-NIK, 2014 Metódusok Minden metódus tagja egy osztálynak (tagfüggvény) A metódusok rendelkeznek: –Megadott, nulla vagy változó darabszámú paraméterrel (params kulcsszó). A paraméterátadás módja in (jelöletlen), out vagy ref. –Visszatérési értékkel (ha nincs: void) A paraméterek és a visszatérési értékek határozzák meg azt a protokollt, amelyet a metódus használatához be kell tartani –A visszatérési értéket és a paramétereket magában foglaló, a kifejtést nem tartalmazó megadási formát szokták a függvény szignatúrájának nevezni void EgyparaméteresMetódus(bool feltétel) {... } void TöbbparaméteresMetódus(int a, float b, out string c) {... } void MindenbőlSokatElfogadóMetódus(params object[] paraméterTömb) {... } void NincsVisszatérésiÉrtékem() {... } int EgészSzámotAdokVissza(float paraméter) {... } string VálaszomEgyKaraktersorozat(string bemenőAdat) {... } SajátTípus Átalakító(SajátTípus forrásObjektum, int egyikAdattagÚjÉrtéke, string másikAdattagÚjÉrtéke) {... } void TöbbparaméteresMetódus(int a, float b, string c); C#

38 38 / 52 ÓE-NIK, 2014 Metódusok túlterhelése* Egy osztályon belül létrehozhatunk több azonos nevű, de eltérő paraméterlistával rendelkező metódust –Ezzel a technikával ugyanazt a funkciót többféle paraméterrel meg tudjuk valósítani ugyanazon a néven –Logikusabb, átláthatóbb programozási stílust tesz lehetővé *: overloading (néhol átdefiniálás) C#

39 39 / 52 ÓE-NIK, 2014 Metódusok Az osztály saját metódusainak belsejében elérjük az osztályhoz tartozó változókat, illetve az osztályban deklarált metódusokat is használhatjuk class ComplexNumber { double real; double imaginary; double Abs() { return Math.Sqrt(Math.Pow(real, 2) + Math.Pow(imaginary, 2)); } C#

40 40 / 52 ÓE-NIK, 2014 Példányosítás ComplexNumber c = new ComplexNumber(); A new operátor elvégzi az objektum számára a memóriafoglalást, és meghívja a megfelelő konstruktort Osztályok és objektumok tagjainak elérése: „. ” operátor –Példányszintű tagoknál a példány nevét, osztályszintű tagoknál (ezeket lásd később) az osztály nevét kell az operátor elé írnunk Az osztály saját tagjainak elérésekor (tehát az osztály saját metódusainak belsejében) nem kell kiírni semmit Ilyenkor általában egyértelmű, hogy az osztály saját tagjaira utalunk Szükség esetén jelölhető (this, vagy osztályszintű tagnál osztály neve) c.real = 20; c.imaginary = 2; Console.WriteLine(c.Abs()); C#

41 41 / 52 ÓE-NIK, 2014 A this referencia A példányszintű metódusokban lévő rejtett referencia arra az objektumra, amelyik a metódust éppen végrehajtja –Nem kell deklarálni, ezt a fordítóprogram automatikusan megteszi –Általában a következő esetekben használatos: Az érvényes hatókörön belül több azonos nevű tag található, így ezek a tagok csak segítséggel azonosíthatók egyértelműen Az aktuális objektumot paraméterként vagy eredményként szeretnénk átadni double Abs() { return Math.Sqrt(Math.Pow(this.real, 2) + Math.Pow(this.imaginary, 2)); } C#

42 42 / 52 ÓE-NIK, 2014 Osztálydeklaráció: („public” jelentését később tisztázzuk) Osztály használata (objektumlétrehozás, objektum használata): –Ez a kód („hívó kód”, „felhasználó kód”) pl. valamely más osztály valamelyik metódusán belül helyezkedik el –Tisztán OOP nyelvekben (C# is) a főprogram maga is egy osztályban metódus (C#: Main() osztályszintű metódus, többnyire Program osztályban) Osztályok használata (eddig) class ComplexNumber { public double real; public double imaginary; public double Abs() { return Math.Sqrt(Math.Pow(real, 2) + Math.Pow(imaginary, 2)); } ComplexNumber c = new ComplexNumber(); c.real = 20; c.imaginary = 2; Console.WriteLine(c.Abs()); C#

43 43 / 52 ÓE-NIK, 2014 Konstruktor Minden osztálynak rendelkeznie kell konstruktorral –A konstruktorok neve mindig megegyezik az osztály nevével –Nincs visszatérési értéke (void sem) –Több konstruktort is létrehozhatunk más-más paraméterlistával Egy konstruktor a this kulcsszó segítségével meghívhat egy másik konstruktort is (a base kulcsszó segítségével pedig az ősét – később) –Ha mi magunk nem deklarálunk konstruktort, akkor és csak akkor a C# fordító automatikusan létrehoz egy paraméter nélküli alapértelmezett konstruktort class ComplexNumber { public double real; public double imaginary; public ComplexNumber(double real, double imaginary) { this.real = real; this.imaginary = imaginary; } C#

44 44 / 52 ÓE-NIK, 2014 Példány élettartama, destruktor Az objektumok megszüntetése automatikus (GC), az objektum akkor szűnik meg, amikor biztosan nincs már rá szükség Destruktor: –Neve egy tildéből (~) és az osztály nevéből áll –Nincs visszatérési értéke, paramétere, láthatósági szintje ~ComplexNumber() {... } Akkor fut le, ha a példány megsemmisül Fő feladata: erőforrás-felszabadítás Nem hívható, a GC hívja ismeretlen időben - azonnali felszabadítást (pl. hálózati vagy adatbázis-kapcsolatok, fájlok lezárása...) más módon kell végezni (Dispose pattern) C#-ban a felesleges destruktorok lassítják a GC működését – kerüljük, és üres destruktort sohasem írunk C#

45 45 / 52 ÓE-NIK, 2014 Láthatósági szintek Az osztály minden tagjához egy láthatósági szint van rendelve –Amennyiben nincs kiírva, akkor is (tagoknak private) A láthatósági szint azt befolyásolja, hogy az adott tag elérhető-e kívülről (hívó kódból), vagy csak belülről (az osztályon belül használható) – C#-ban is vannak további szintek Cél: mindig a lehető legszűkebb láthatósági kör! publicKorlátlan privateCsak az adott osztályon belül érhető el protectedCsak az adott osztályban és az utódosztályokban érhető el (később) internalCsak az adott assemblyn belül lehet használni (később) protected internalCsak az adott assemblyn belül, vagy utódokban (később) class ComplexNumber { public double real; public double imaginary; } C#

46 46 / 52 ÓE-NIK, 2014 Tulajdonságok A tulajdonságok olyan „intelligens mezők”, amelyek olvasását és írását a programozó által megadott ún. hozzáférési metódusok végzik –A felhasználó kód számára mezőnek tűnnek A hozzáférési metódusok bármilyen műveletet végrehajthatnak (pl. beírandó adat ellenőrzése, kiolvasandó adat kiszámítása…) –Nem célszerű hosszan tartó műveletekkel lelassítani a tulajdonság elérését –Kerülni kell a felhasználó kód számára váratlan mellékhatásokat C#

47 47 / 52 ÓE-NIK, 2014 Tulajdonságok Létrehozhatók csak olvasható vagy csak írható tulajdonságok is –Ha nem adjuk meg az írási, illetve olvasási metódust, akkor csak olvasható, illetve csak írható tulajdonság jön létre Az olvasási és írási metódusoknak is van hozzáférési szintje –Ezzel a módszerrel például létrehozhatók nyilvánosan olvasható, de csak a saját vagy a leszármazott osztályok által írható tulajdonságok Az olvasási metódust a get, az írási metódust a set kulcsszó segítségével kell megadnunk –A hozzáférési metódusokat a tulajdonság definícióján belül kell megadnunk C#

48 48 / 52 ÓE-NIK, 2014 class Személy { private string vezetéknév = " "; private string keresztnév = " "; public string Vezetéknév { get{ return vezetéknév; } set{ if (value != "") vezetéknév = value; } } public string Keresztnév { get{ return keresztnév; } set{ if (value != "") keresztnév = value; } } public string Név { get{ return vezetéknév + " "+ keresztnév; } } Tulajdonságok (példa) C# A tulajdonság megadott új értékét mindig egy value nevű rejtett paraméter tartalmazza A tulajdonság értékét a return kulcsszóval adjuk vissza a hívónak Nem adtunk meg set metódust, így ez a tulajdonság csak olvasható Gyakori megoldás, hogy a nyilvános tulajdonság neve nagybetűs, a hozzá tartozó privát mező neve pedig ugyanaz kisbetűs változatban C#

49 49 / 52 ÓE-NIK, 2014 class Személykezelő { static void Main() { Személy Pistike = new Személy(); Console.WriteLine("Üres nevem: " + Pistike.Név); Pistike.Keresztnév = "István"; Console.WriteLine("Félkész nevem: " + Pistike.Név); Pistike.Vezetéknév = "Kovács"; Pistike.Keresztnév = ""; Console.WriteLine("Nevem: " + Pistike.Név); Console.ReadLine(); } Tulajdonságok (példa) C#

50 50 / 52 ÓE-NIK, 2014 Osztályszintű tagok Az osztályszintű mezők az osztály saját adatmezői –Minden osztály csak egyet tárol ezekből a mezőkből, függetlenül a később létrehozott példányok számától Ezeket a mezőket tehát nem egyes példányok birtokolják, hanem közösek a példányok számára Az osztályszintű metódusok nem példánytól függő viselkedéseket, képességeket reprezentálnak –Akkor is hívhatók, ha még egyetlen példány sem létezik az osztályból Csak osztályszintű mezőket használhatnak Osztályszintű metódusoknál nem létezik aktuális objektum, így this referencia sem Konkrét példányhoz nem kötődő feladatra is alkalmasak (pl. főprogram megvalósítása, konverziók, operátorok) C#

51 51 / 52 Ó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#

52 52 / 52 Ó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#


Letölteni ppt "Programozás I. Objektumorientált paradigma. 2 / 52 ÓE-NIK, 2014 Programozástörténelem Első számítógép (ENIAC): 1946 –A programot kapcsolótáblán kellett."

Hasonló előadás


Google Hirdetések