You are on page 1of 37

02.

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
feleadatot 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: Rex:
: KUTYA
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
14
Polimorfizmus
• A polimorfizmus a programnak azon képessége, hogy
alkalmazkodik ahhoz az adatípushoz, amelyik éppen
feldolgozás alatt áll.

15
• Pl. a mértani alakzatok halmaza. Ki kell számítani az egyes mértani
alakzatok felületét – különböző képletek az alakzattól függően.
• A polimorfizmus lehetővé teszi, nem szükséges külön kivizsgálni
melyik alakzatról van szó.
• Szükséges az alakzatok osztálya, amely szerint mindegyik
alakzatnak van felülete. (apsztrakt osztály)
• Minden alakzat számára létezik egy alosztály, amelyik tartalmazza
a felületszámításhoz szükséges képletet.
• A főosztályban nem számítahtó ki a felület. Ez egy üres – absztrakt
metódus. Ez csak az alosztályok közös tulajdonságainak
kifejezésére szolgál. Nincs értelme ilyen típusú objektumok
létrehozásának.

16
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
• A mezők legtöbbször privátok, míg a metódusok többnyire
nyilvánosak.
• A privát mezőkhöz csak a nyilvános metódusok segítségével
lehet hozzajutni, mivel ezek biztosítják, hogy minden
állapotváltozás ( a mező értékének változása) összhangban
legyen az osztály definíciójával. A nyilvános mezők esetén nem
ellenőrizhető a megfelelő felhasználásuk.
• A privát metódusok lehetővé tesznek kiegészítő műveleteket a
nyilvános metódusok számára.

18
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