You are on page 1of 35

Osztályok (classes)

Az objektum orientált
programozás alapelvei

2
• Procedurális programozás - klasszikus programozási stílus az eljárások
felé irányul. A logikailag egymáshoz kapcsolódó lépések sorozatát
nevezhetik alprogramnak, procedurának vagy függvénynek. Az összetett
feladatot ezeknek a kombinálásával lehet végrehajtani. Ilyen nyelvek a
Pascal és a C.
• Objektum orientált programozás - program ún. objektumokból áll,
amelyeknek meghatározott állapotai és viselkedés módjai vannak. Az
állapotok az objektumok értékeit jelentik, amelyek idővel változhatnak. A
viselkedési módok az állapotváltozás szabályait, a környezeti változásokra
való reakciót, ill. a környezetre való hatást jelentik. Az egész feladat úgy
valósul meg, mint az objektumok egymás közötti hatása a programon
belül.

3
• A hasonló tulajdonságokkal rendelkező objektumok csoportjait
osztályoknak nevezik (class). Egy osztály objektumai ugyanolyan
lehetséges állapotokkal és viselkedési módokkal rendelkeznek. Egy adott
osztály objektumai saját osztályuk egyedi példányai.
Példa:
A kutya (osztály) egy állat közismert általános tulajdonságokkal. A tacskó
(objektum) egy pontosan meghatározott kutyafajta konkrét
tulajdonságokkal (szín, súly, életkor) és viselkedési módokkal, amelyek
megegyeznek az összes kutya viselkedési módjával.

4
Osztály
Blöki: KUTYA Rex: KUTYA : KUTYA
KUTYA

Ismert a KUTYA osztály A KUTYA osztály


példányainak neve általános példánya

KUTYA : KUTYA : KUTYA

Név: text Név : Žućko Név : Rex


Fajta: text Fajta : keverék Fajta : német juhász
Életkor: integer Életkor : 3 Életkor : 7

Az osztály, azaz objektum atributumai (tuladonságai)

5
KUTYA

Név: text
Fajta: text
Életkor: integer

Gazdát_cserél
Beoltják

Feltüntethetők az osztályra jellemző metódusok.

6
• Az osztályok adattípusoknak is tekinthetők programozási
szempontból, mivel meghatározzák a példányaik lehetséges
értékeit és a példányaikon végrehajtható műveleteket. Eszerint az
objektumok osztálytípusú adatok. Ezek összetett adattípusok.
• Az objektum állapotai adatokkal ábrázolhatók az objektumon
belül, amelyeket mezőknek neveznek. A mezők lehetnek egyszerű
(egész, reális számok) vagy összetett adatok (tömbök, osztályok)

7
• A metódus az az eljárás, amellyel megvalósul az objektum viselkedése az
osztályon belül. A metódusok megfelelnek a függvényeknek és a
proceduráknak a klasszikus programnyelvekben.
• Az osztályok mezőit és metódusait közös néven az osztály tagjainak
nevezik.
• Az objektumorinetált programozás nagy előnye, hogy abban az esetben ha
bevezetnek egy új osztályt, a programnak csak azokat a részeit kell
megváltoztatni ahol az megjelenik. Ha egy osztály lehetőségei kibővülnek,
akkor a programnak azokat részeit, amelyek a meglévő lehetőségeket
használják, nem kell megváltoztatni.
• Legelterjedtebb objektumorientált programnyelvek: C++, Java, C.

8
• Az objektumorientált programozás öt alapelven nyugszik:
– apsztrakció,
– egységbezárás,
– öröklődés,
– polimorfizmus,
– a kód újrafelhasználhatósága.

9
Absztrakció
• Az absztrakció az összetett objektumok lényegtelen
tulajdonságainak elhanyagolása, a pillanatnyi szükségleteknek
megfelelően. (pl. tv)
• A programozásban az apsztrakció azoknak a tulajdonságoknak –
paramétereknek a kiválasztását jelenti, amelyek lényegesek a
megoldandó feladat szempontjából.

10
Egységbezárás (encapsulation)

• Az egységbezárás az mechanizmus, amellyel az egyes osztályok


adatait és eljárásait megvédik a nemkívánt külső hatásoktól.
• A programozásban az egységbezárás az osztály elemeinek
nyilvános és privát tagokra való osztásával valósul meg. A
nyilvános tagokat szabadon lehet használni bárhol a programban,
míg a privát tagok csak az osztályon belül érhetők el.

11
Az adatok privátok, a metódusok nyilvánosak

osztály
nyilvános metódus
nyilvános mező
privát metódus
privát mező
hozzáférés a külvilágból
tilos hozzáférés
hozzáférés az osztályon
belül

A külvilágból a privát mezőkhöz csak nyilvános metódusokkal lehet hozzáférni.


Ellenőrzött hozzáférés – pl. dátum.
12
Öröklődés
• Az osztályok egymáshoz hasonló objektumok csoportja. Az osztályon belüli
objektumok csoportosíthatók valamilyen különleges tulajdonságuk alapján,
különleges osztályba. Ez a különleges osztály az alosztály(utódosztály), az
általánosabb pedig a főosztály(ősosztály).
• Az alosztály (utódosztály) a saját specifikus tulajdonságai mellett rendelkezik
a főosztály (ősosztály) összes tulajdonságával, azt mondják, hogy az alosztály
(utód) örökli a főosztályt (őst).
• Az objektumorientált programozásban ez azt jelenti, hogy utódosztályban
megvan az ősosztály összes mezője és metódusa, valamint az utódosztály
specifikus mezői és metódusai. A járulékos mezők lehetővé tesznek további
lehetséges állapotokat, a további metódusok pedig az utódosztály
objektumainak további viselkedésmódjait az ősosztályhoz képest.

13
villamos készülékek

energetikai elektronikai
készülékek készülékek

tűzhely bojler mosógép TV zenevonal

14
Polimorfizmus
• A polimorfizmus a programnak azon képessége, hogy
alkalmazkodik ahhoz az adatípushoz, amelyik éppen
feldolgozás alatt áll.

15
A kód újrafelhasználhatósága
• A hatákonyabb programozás érdekében kívánatos, hogy az egyszer már
megírt programrészek újra felhasználhatók legyenek újra írás nélkül.
• A klasszikus procedurális programozásban ez a függvénykönyvtárak
alkalmazását jelenti.
• Ez a módszer létezik az objektumorientált programozásban, ahol általános
célú osztályok könyvtárát használják
• Az öröklődés a kód újrafelhasználásának másik módja. Az ősosztályban
megírt metódusok átöröklődnek az utódosztályokba és így nem kell őket
újraírni. Az utódosztályokban csak azokat a metódusokat kell megírni,
amelyek az utódok járulékos tulajdonságait biztosítják az ősökhöz képest.

17
Hivatkozás típusú adatok

• A hivatkozás típusú adatok (reference type) csak az adat memória


címét tartalmazzák, nem magát az adatot.
• A változó értéke a hivatkozott adat értéke lesz, nem a hivatkozott adat
címe. Az ilyen adatokon végrehajtott műveletek a hivatkozott adaton
hajtódnak végre nem a valóban tartalmazott címet.
• Több változó is hivatkozhat ugyanarra az adatra. Ha egyik változó
megváltoztatja az adat értékét, megváltozik az adatra mutató többi
hivatkozás típusú változó értéke is.

19
a) b)

a) érték típusú változók (x,y,z)


b) hivatkozás típusú változók (a,b,c) – ha b megváltozik,
megváltozik c is.

20
• Az osztályok összetett adattípusok, amelyek különböző adattípusokból állnak.
Ezek az elemek az osztály tagjai (class memebers).
• Az osztály típusú adatok az adott osztály példányai (class instances) és ezeket
objektumoknak (objects) nevezzük.
• Az osztályok hivatkozás típusú adatok (reference type). Csak az adat memória
címét tartalmazzák, nem magát az adatot. A változó értéke a hivatkozott adat
értéke lesz, nem a hivatkozott adat címe. Az ilyen adatokon végrehajtott
műveletek a hivatkozott adaton hajtódnak végre nem a valóban tartalmazott
címet.
• Az osztályok tagjai lehetnek adat tagok vagy függvény tagok.
• Az adat tagok az osztály, illetve objektum mezői.
• A függvény tagok – metódusok – függvények (alprogramok) – műveleteket
hajtanak végre az adat tagokon (mezőkön) és ezáltal megváltoztatják az objektum
állapotát.
21
• Az osztály tagjai lehetnek nyilvánosak és privátok.
• A privát (private) tagokhoz csak a figyelt osztályon belül lehet hozzáférni.
Csak az osztályhoz tartozó metódusok (függvények – alprogramok)
használhatják ezeket az adatokat.
• A nyilvános (public) tagokhoz hozzá lehet férni úgy az osztályon belül,
mint a az osztályon kívül, a program többi részéből.
• Az osztályoknak ez a tulajdonsága a hozzáférhetőség (accessibility) ill. a
hozzáférési jogok (access right).
• Az esetek túlnyomó többségében az adatok privátok, míg a metódusok
leginkább nyilvánosak, de lehetnek privátok is.

22
• Az osztályok valódi adattípusok mert:
– meghatározzák az objektumok lehetséges értékét,
– meghatározzák az objektumokon végrehajtható műveleteket,
– megakadályozzák bármilyen más művelet végrehajtását az
objektumokon,
– biztosítják az objektumok kötelező kezdőérték adását (inicalizáció),
– biztosítják az objektumok megsemmisítését, ha már nincs rájuk
szükség.

23
Az osztályok definíciója és deklarációja
• Az osztály definíciója az osztály összes tagjának a
felsorolása.
• A definició alapján meghatározható a szükséges memória
nagysága az adatok és a függvények számára.

modifikátorok class osztaly_neve


{
modifikátor tag
modifikátor tag

}
24
• osztály_név – azonosító és egyben típus azonosító
is. Adat definiálásra használják amikor létrehozzák az
osztályok példányait – az objektumokat. Az osztály
azonosítója általában nagy betűvel kezdődik.
• modifikátor – Meghatározza az osztály illetve
tagjainak egyes tulajdonságait. Felsorolható több
modifikátor is, amelyek sorrendje tetszőleges. A
következő modifikátorok közül csak egyszerre csak egy
használható (de vannak más modifikátorok is … ).
• Az osztály definiciójában használt modifikátorok az
internal és a public. Az internal osztály az egy
programhoz tartozó osztályok esetén használható, míg a
nyilvános osztály más programokból is használható.
25
• Az osztály tagjainak definíciójiban használhatók a
private, internal, és public modifikátorok.
• A private tagok csak abban az osztályban
használhatók, amelyben definiálták őket.
• Az internal tagok csak abban az egységben
(alkalmazás – application, vagy könyvtárban –
library) használhatók, amelyben definiálásra kerültek.
• A public tagok pedig bárhonnan elérhetők.
• A tagok alapértelmezett típusa private.

26
• Az osztály tagja lehet:
– mező
– metódus
– konstruktor
– destruktor
– tulajdonság
– indexer
– másik osztály
– esemény
• A tagok neve azonosító és felhasználható az osztályon belül
a definiálás helyétől függetlenül, definiálás helye előtt is, és
után is. A mezők nevei általában kis betűkkel kezdődnek.
• Minden osztálynak saját érvényességi köre van (class
scope), tehát ugyanaz a mező név több osztályban is
előfordulhat.
27
• Azt, hogy egy tag valamelyik osztály érvényességi
köréhez tartozik a minősített nevével (qualified name)
jelölik
ÉrvényességiKör.TagNeve
• Az ÉrvényességiKör az osztály neve (lehet más
is ...)
• A .az érvényességi kör kialakító (scope resolution)
operátor
• A TagNeve a tag neve minősítő nélkül egyszerű név
(simple name)

28
Hozzáférés az osztály tagjaihoz
objektum.tag
• A pont (.) bináris operátor 15. prioritású és balról
jobbra hajtódik végre.
• Az objektum egy objektum azonosító, de lehet egy
összetett kifejezés eredménye is. Nem lehet null.
• A tag lehet mező, metódus, vagy más típusú tag.
• Ha az osztályon belül férnek hozzá egy objektumhoz,
akkor a this kulcsszót kell használni. Ez azt jelenti,
hogy az éppen használatban lévő objektumhoz
(aktuális vagy folyó objektum) nyúlnak hozzá:
this. tag vagy csak tag
29
Az osztály mezői
• Az osztályok mezőit ugyanúgy definiálják, mint az önálló
adatokat:
TípusNév mezőNev = Kezdőérték, mezőnév= …
• Egyszerre definiálható több azonos típusú mező
• A TípusNév lehet bármely egyszerű, összetett, vagy osztály
adattípus.
• A mezőNevhez hozzárendelhető kezdőérték (inicializátor), de
ha ez nem történik meg, az osztály mezői akkor a megfelelő típus
nulla értékét tartalmazzák.
• A kezdőérték lehet bármilyen kifejezés, amely nem tartalmazza
az adott osztály más mezőit és metódus hívásait is.
• A mező lehet változatlan is, ha feltüntetik a const modifikátort.
• A mezők (adattagok) szinte kivétel nélkül privátok.

30
class Alfa {
private int a=1, b; // b==0
public long C=3+4*5;
private double d=a+5; //Hiba: nem lehet a
private short[] e={1,2,3,4};
private char[][] g; // g== null
private string h="Jo napot.";
private Alfa i; // i==null
public readonly int J=55;
public readonly double K; //egyelore K==0
}

31
class AlfaTest{
static void Main(){
Alfa a=new Alfa() //objektum letrehozasa
a.C=35;
a.b=56; //HIBA b nem hozzaferheto
int x=a.J
a.K=13; //HIBA: K erteke nem valtoztathato
}
}

32
Konstruktorok
• A konstruktorok speciális metódusok
(tagfüggvények), amelyek az új objektumok
inicializálására (kezdőértékadására) szolgálnak.
• A konstruktor feladata, hogy a kiosztott memóriát az
osztály tulajdonságaival rendelkező objektummá
alakítsa át.
• Automatikusan meghívásra kerülnek az osztály
objektumainak létrehozásakor, attól függetlenül, hogy
milyen objektumról van szó (állandó, átmeneti,
dinamikus).

33
Konstruktorok
OsztályNév (ParaméterLista) KonstruktorTest
• A konstruktor neve megegyezik az osztály nevével. A metódusok
nevének túlterhelése megjelenhet a konstruktoroknál is (egy
osztálynak lehet több konstruktora is)
• A konstruktoroknak is megvan a this rejtett paramétere, amelyik
az éppen létrehozott (aktuális) objektumra mutat
• A KonstruktorTestben meghívhatók az osztály más metódusai,
de figyelembe kell venni, hogy azoknak a mezőknek a tartalma,
amelyeknek nincsenek inicializátorai, az értéke nulla a konstruktor
test elején
• A konstruktorok nem adanak vissza semmilyen értéket, de
definiáláskor tilos a void használata a függvény értékére. A
konstruktor nem tartalmazhat return kifejezés utasítást sem,
esetleg a return paraméter nélkül.
34
Konstruktorok
• A paraméter nélküli konstruktor az alapértelmezett
konstruktor (default constructor vagy noarg
constructor).
• Az alapértelmezett konstruktor automatikusan
generálódik az osztályban, ha az osztálynak nincs
definiált konstruktora. Az ilyen konstruktornak üres
a teste, így az objektum inicializálása a mezők
inicializálására korlátozódik.
• Ha az osztályban definiálnak legalább egy
konstruktort, az alapértelmezett konstruktor nem
generálódik.
35
Konstruktorok

• A konstruktorok nem hívhatók meg egy objektumra, mint a többi


metódus, mivel a hívásuk pillanatában az objektum még nem
létezik. Leginkább az objektum létrehozására szóló kifejezés
segítségével hívódnak meg. Hogy melyik konstruktor kerül
meghívására, azt az argumentumok száma és típusa dönti el.
• A második konstruktor meghívható inicializátor hozzáadásával,
amelynek általános alakja :this(argumentumok) segítségével a
ParaméterLista után és a KonstruktorTest előtt:
OsztályNév (ParaméterLista):this(argumentumLista) KonstruktorTest

• Az argumentumListaban felhasználhatók a
ParaméterLista elemei. Nem hívhatók meg az osztály
metódusai a folyó (éppen keletkező) objektumra

36
Példa: Konstruktorok
class Teglalap {
private double _a, _b;
public Teglalap(double a, double b){_a=a; _b=b;}
public Teglalap(double a):this(a,a) {}
public Teglalap(){_a=_b=1;}
public void Iras(){
Console.WriteLine("a="+_a+", b="+_b);
}
}
class TeglalapTeszt{
static void Main(){
Teglalap t=new Teglalap(3,4);
t.Iras();
t=new Teglalap(5);
t.Iras();
new Teglalap().Iras();
}

37

You might also like