Professional Documents
Culture Documents
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
5
KUTYA
Név: text
Fajta: text
Életkor: integer
Gazdát_cserél
Beoltják
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)
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
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
19
a) b)
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