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

Hasonló előadás


Az előadások a következő témára: "Programozás I. Objektumorientált paradigma"— Előadás másolata:

1 Programozás I. Objektumorientált paradigma

2 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: Elvek, módszerek, szabványok 1955 táján már léteztek olyan számítógépek, amelyekkel nem csak tudományos kutatások és katonai alkalmazások igényeit lehetett kielégíteni A programokat speciális tudású kutatók készítették (tipikusan villamosmérnök vagy matematikus) A programok készítése assembly nyelven történt Minden program egyedi darab volt, és erősen kötődött ahhoz a számítógép modellhez, amire készült. Assemblers have been available since the 1950s MOV BL, 055H

3 Assembly nyelvű program – részlet
section .text global _start _start: mov edx,len mov ecx,msg mov ebx,1 mov eax,4 int 0x80 mov eax,1 section .data msg db 'Hello, world!', 0xa len equ $ - msg Forrás Ez késői (fejlettebb) assembly Nincsenek fejlett nyelvi szerkezetek Néhány kisebb könnyítést biztosít az assembly „fordító”

4 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 Helyesség Megbízhatóság Felhasználóbarátság Alkalmazkodóképesség Kis számítási igény Kis memóriaigény A 60-as évek végén következett be a későbbiekben „szoftver-krízis”-nek nevezett probléma. A hardver fejlesztések eredményeként megjelentek az úgynevezett harmadik generációs számítógépek, az előző modellekhez képest lényegesen hatékonyabban erőforrásokat nyújtva. Ezzel olyan problémák megoldására is alkalmassá váltak, amelyek egy nagyobb és bonyolultabb programok írását tették szükségessé. A korábban használt eszközök azonban erre egyre alkalmatlanabbnak bizonyultak. A növekvő fejlesztési igényeket nem lehetett időben kielégíteni, így a csökkenő hardver árakkal szemben egyre növekvő szoftver költségek jelentkeztek, az elkészült programok pedig nem megfelelő minőségűek lettek. a megengedett input adathalmaz nem minden elemére értelmezett, esetleg • nem minden elemre fejeződik be, vagy • hibás eredményeket szolgáltat *csak egyféleképpen dolgozik, például nem lehet rövidítéseket használni, vagy • a hibajelzések kétértelműek, nem elég világosak, vagy * új gépkonfiguráció esetén nem képes az új lehetőségeket használni * Növekvő terheléskor csökken a teljesítmény

5 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] 1968 Nato Software Engineering Conference, NATO SCIENCE COMMITTEE

6 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) 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) High-level programming languages that originally lacked programming structures, such as FORTRAN, COBOL, and BASIC, now have them. (FORTRAN 1957, COBOL 1959, BASIC 1964 …)

7 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 =moduláris programozás

8 Programozási paradigmák – procedurális/moduláris programozás

9 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 A class is a definition that specifies certain characteristics that all instances of the class share. These characteristics are determined by the properties, methods, and events that define the class and the values of attributes that modify the behavior of each of these class components. Class definitions describe how objects of the class are created and destroyed, what data the objects contain, and how you can manipulate this data. A class is like a template for the creation of a specific instance of the class. This instance or object contains actual data for a particular entity that is represented by the class. For example, an instance of a bank account class is an object that represents a specific bank account, with an actual account number and an actual balance. This object has built into it the ability to perform operations defined by the class, such as making deposits to and withdrawals from the account balance. Objects are not just passive data containers. Objects actively manage the data contained by allowing only certain operations to be performed, by hiding data that does not need to be public, and by preventing external clients from misusing data by performing operations for which the object was not designed. Objects even control what happens when they are destroyed.

10 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 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 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 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 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 A class is a definition that specifies certain characteristics that all instances of the class share. These characteristics are determined by the properties, methods, and events that define the class and the values of attributes that modify the behavior of each of these class components. Class definitions describe how objects of the class are created and destroyed, what data the objects contain, and how you can manipulate this data. A class is like a template for the creation of a specific instance of the class. This instance or object contains actual data for a particular entity that is represented by the class. For example, an instance of a bank account class is an object that represents a specific bank account, with an actual account number and an actual balance. This object has built into it the ability to perform operations defined by the class, such as making deposits to and withdrawals from the account balance. Objects are not just passive data containers. Objects actively manage the data contained by allowing only certain operations to be performed, by hiding data that does not need to be public, and by preventing external clients from misusing data by performing operations for which the object was not designed. Objects even control what happens when they are destroyed.

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

17 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á” Film film2 Film film1 Cím=‘A keresztapa’ Cím=‘A remény rabjai’ Hossz=175 Hossz=142 Formátum=‘mpeg4’ Formátum=‘wmv9’ Konvertál() Konvertál()

18 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 példányosítás

19 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 Osztály C#-ban „Objektumban tárolt adat” „Objektum képességei”
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 Osztály C++ nyelven „Objektumban tárolt adat” „Objektum képességei”
#include <string> #include <fstream> 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 Osztály Matlab nyelven
classdef Naplo < handle properties FajlNev end methods function obj = Naplo(fajlNev) obj.FajlNev = fajlNev; function obj = Beir(obj, uzenet) fileID = fopen(obj.FajlNev,'w'); fprintf(fileID,uzenet); fclose(fileID); „Objektumban tárolt adat” „Objektum képességei”

23 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 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 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 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 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 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 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 Osztályszintű tagok 1. Osztályokhoz tartozó mezők és metódusok
ProgI 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 tipikusan nyugdíjkorhatár mező, ne kelljen minden objektumban eltárolni Vámossy (OE NIK)

31 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 Osztály- és példányszintű tagok

33 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
- SZOFTVER KRÍZIS részt még keményen revideálni

35 Osztályok deklarálása
C# 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 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 C# 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 * ( );

37 Metódusok C# 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);

38 Metódusok túlterhelése*
C# Metódusok túlterhelése* C# 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)

39 C# Metódusok class ComplexNumber { double real; double imaginary; double Abs() return Math.Sqrt(Math.Pow(real, 2) + Math.Pow(imaginary, 2)); } 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

40 C# 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());

41 C# A this referencia C# 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)); }

42 Osztályok használata (eddig)
C# Osztályok használata (eddig) 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) 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());

43 Konstruktor Minden osztálynak rendelkeznie kell konstruktorral C#
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; }

44 Példány élettartama, destruktor
C# 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

45 Láthatósági szintek Cél: mindig a lehető legszűkebb láthatósági kör!
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! class ComplexNumber { public double real; public double imaginary; } public Korlátlan private Csak az adott osztályon belül érhető el protected Csak az adott osztályban és az utódosztályokban érhető el (később) internal Csak az adott assemblyn belül lehet használni (később) protected internal Csak az adott assemblyn belül, vagy utódokban (később)

46 C# Tulajdonságok C# 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

47 C# Tulajdonságok C# 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

48 Tulajdonságok (példa)
C# Tulajdonságok (példa) C# 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 class Személy { private string vezetéknév = "<üres>"; private string keresztnév = "<üres>"; 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; } A tulajdonság értékét a return kulcsszóval adjuk vissza a hívónak A tulajdonság megadott új értékét mindig egy value nevű rejtett paraméter tartalmazza Nem adtunk meg set metódust, így ez a tulajdonság csak olvasható

49 Tulajdonságok (példa)
C# Tulajdonságok (példa) C# 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(); }

50 Osztályszintű tagok Az osztályszintű mezők az osztály saját adatmezői
C# Osztályszintű tagok C# 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)

51 Osztályszintű tagok - példa
C# 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) Konstruktor Destruktor

52 Osztályszintű tagok - példa
C# 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.ReadLine(); }


Letölteni ppt "Programozás I. Objektumorientált paradigma"

Hasonló előadás


Google Hirdetések