Professional Documents
Culture Documents
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
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
villamos készülékek
energetikai elektronikai
készülékek készülékek
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
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.
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
• 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