OOP #1 (Bevezetés) v1.0 2003.03.07. 18:39:00
Eszterházy Károly Főiskola Információtechnológia tsz.
Hernyák Zoltán adj. e-mail:
[email protected] web: http://aries.ektf.hu/~aroan OOP
OOP_01
-1-
E jegyzet másolata nem használható fel szabadon, az előadás anyagának kivonata. Ezen teljes jegyzetről, vagy annak bármely részéről bármely másolat készítéséhez a szerző előzetes írásbeli hozzájárulására van szükség. A másolatnak tartalmaznia kell a sokszorosításra vonatkozó korlátozó kitételt is. A jegyzet kizárólag főiskolai oktatási vagy tanulmányi célra használható! A szerző hozzájárulását adja ahhoz, hogy az EKF számítástechnika tanári, és programozó matematikus szakján, a tárgyat az EKF TO által elfogadott módon felvett hallgatók bármelyike, kizárólag saját maga részére, tanulmányaihoz egyetlen egy példány másolatot készítsen a jegyzetből. A jegyzet e változata még tartalmazhat mind gépelési, mind helyességi hibákat. Az állítások nem mindegyike lett tesztelve teljes körűen. Minden észrevételt, amely valamilyen hibára vonatkozik, örömmel fogadok. Hernyák Zoltán
[email protected]
OOP
OOP_01
-2-
OOP története Struktúrált programozás: • Program = adat + algoritmus • 60-as években Böhm és Jacopini sejtése : bármely algoritmus leírható az alábbi 3 vezérlési szerkezet véges sokszori alkalmazásával o szekvencia o szelekció o iteráció • A fenti sejtést Mills bizonyította
OOP története
OOP_01
-3-
Objetum orientált programozás: • Alan Kay diplomamunkája 1969 • Tervek és elképzelések • SmallTalk programozási nyelv megtervezése • Meglévő eljárásorientált nyelveket bővítik OOP lehetőségekkel (Pascal, C) • Új, tisztán OO nyelveket terveznek (Java, C#)
Nyelvek osztályozása: • Hagyományos nyelvek (C) • OOP támogató nyelvek (Pascal, Delphi, C++) • Tisztán OOP nyelvek (C#, Java)
OOP története
OOP_01
-4-
OOP alapelvei 1.
Egységbezárás (encapsulation): az adatok és a hozzájuk tartozó eljárásokat
egyetlen egységben kezeljük (objektum-osztály) • Az osztály mezői tárolják az információkat • A metódusok kommunikálnak a külvilággal • Az osztály változóit csak a metódusokon keresztül változtathatjuk meg • A valós világ szemléletesebb leírása
OOP alapelvei
OOP_01
-5-
2.
Öröklés (inheritance) : az objektum-osztályok továbbfejlesztésének
lehetősége. Ennek során a származtatott osztály örökli ősétől azok attribútumait, és metódusait, de ezeket bizonyos szabályok mellett újakkal egészítheti ki, és meg is változtathatja • Az eredeti osztály ősosztálynak nevezzük (szülő) • Az új, továbbfejlesztett osztályt származtatott osztálynak (gyerek) • Egy ősből több leszármaztatott osztályt is készíthetünk • Egy származtatott osztálynak o Legfeljebb egy szülője lehet (pl.: Pascal, Java, C#) – öröklődési fa o Több szülője is lehet (pl.: C++) – öröklődési gráf • Metódusok törzsét megváltoztathatjuk • Mezők neveit, típusait általában nem változtathatjuk meg • Új mezőkkel, és metódusokkal egészíthetjük ki az osztályt
OOP alapelvei
OOP_01
-6-
3.
Sokalakúság (polymorphism) : a származtatás során az ős osztályok
metódusai képesek legyenek az új átdefiniált metódusok használatára újraírás nélkül is • Ezt virtuális metódusokon keresztül érhetjük el o Egyes nyelvekben minden metódus virtuális (pl.: Java) o A metódusoknál külön jelezni kell, melyik a virtuális (pl.: Delphi, C#, C++)
OOP alapelvei
OOP_01
-7-
1. Példa (C és C++) (csak egy verem) #include <stdio.h> struct TVerem { int vm; float tomb[100]; }; struct TVerem V; void Init() { V.vm = 0; } void Push(float x) { V.tomb[V.vm]=x; V.vm++; }
1. Példa (C és C++) (csak egy verem)
float Pop() { V.vm--; Return V.tomb[V.vm]; } int main() { Init(); Push(12.5); Push(16.3); Printf(”%f\n”,Pop()); // 16.3 Printf(”%f\n”,Pop()); // 12.5 }
OOP_01
-8-
1. Példa (Pascal) (csak egy verem) type TVerem = record vm:integer; tomb: array [1..100] of real; end; var V:TVerem;
function Pop:real; begin dec(V.vm); Pop := V.tomb[V.vm]; End;
procedure Init; begin V.vm := 0; End;
BEGIN Init; Push(12.5); Push(16.3); Writeln(Pop); // 16.3 Writeln(Pop); // 12.5 END.
procedure Push(x:real); begin V.tomb[V.vm]:=x; Inc(V.vm); End;
1. Példa (Pascal) (csak egy verem)
OOP_01
-9-
2. Példa (C és C++) (több verem) #include <stdio.h> struct TVerem { int vm; float tomb[100]; }; void Init(TVerem *V) { V->vm = 0; } void Push(TVerem *V, float x) { V->tomb[V->vm]=x; V->vm++; }
2. Példa (C és C++) (több verem)
float Pop(TVerem *V) { V->vm--; Return V->tomb[V.vm]; } struct TVerem V1; struct TVerem V2; int main() { Init(&V1); Init(&V2); Push(&V1,12.5); Push(&V1,16.3); Push(&V2,11.3); Printf(”%f\n”,Pop(&V1)); Printf(”%f\n”,Pop(&V2)); Printf(”%f\n”,Pop(&V1)); } OOP_01
- 10 -
2. Példa (Pascal) (több verem) type TVerem = record vm:integer; tomb:array [1..100] of real; end; procedure Init(var V:TVerem) begin V.vm = 0; End; procedure Push(var V:TVerem;x:real) begin V.tomb[V.vm]=x; Inc(V.vm); End;
Hiba! A stílus nem létezik.
Function Pop(var V:TVerem):real; begin dec(V.vm); Pop := V.tomb[V.vm]; End; var V1,V2: TVerem; BEGIN Init(V1); Init(V2); Push(V1,12.5); Push(V1,16.3); Push(V2,11.3); Writeln(Pop(V1)); Writeln(Pop(V2)); Writeln(Pop(V1)); END.
OOP_01
- 11 -
3. Példa (C++) (verem osztály) #include <stdio.h> class TVerem { public: int vm; float tomb[100]; void Init(); void Push(float x); float Pop(); }; void TVerem::Init() { vm = 0; } void TVerem::Push(float x) { tomb[vm]=x; vm++; } 3. Példa (C++) (verem osztály)
float TVerem::Pop() { vm--; return tomb[vm]; } int main() { TVerem v1; TVerem v2; v1.Init(); v2.Init(); v1.Push(12.5); v2.Push(13.4); v1.Push(16.3); printf("%f\n",v1.Pop()); printf("%f\n",v1.Pop()); printf("%f\n",v2.Pop()); return 0; } OOP_01
- 12 -
3. Példa (Pascal) (verem osztály) type TVerem=object vm:integer; tomb:array [1..100] of real; procedure Init; procedure Push(x:real); function Pop:real; end; procedure TVerem.Init; begin vm := 0; end; procedure TVerem.Push(x:real); begin tomb[vm]:=x; inc(vm); end; 3. Példa (Pascal) (verem osztály)
function TVerem.Pop:real; begin inc(vm); Pop := tomb[vm]; End; var V1,V2:TVerem; BEGIN v1.Init; v2.Init; v1.Push(12.5); v2.Push(13.4); v1.Push(16.3); Writeln(v1.Pop); Writeln(v2.Pop); Writeln(v1.Pop); END.
OOP_01
- 13 -
Alapfogalmak Osztály: egy felhasználó által készített típus, mely összetett adatszerkezet – elvileg tartalmazza az adott objektum adatait, és az azokat kezelő eljárásokat. Objektum:
egy
változó,
melynek
típusa
valamely
objektumosztály, vagyis az osztály egy példánya. Attribútum
(adatmező):
az
osztály
egy
mezője,
konkrét
adattárolási képességű adattagja. Alapfogalmak
OOP_01
- 14 -
Metódus:
olyan
eljárás,
mely
része
valamely
objektumosztálynak, így az adott osztály attribútumaival végez valamilyen műveletet. Példányosítás:
egy
objektumosztályból
konkrét
objektum
készítése (objektum-változó deklarálása) Inicializálás: az objektum attribútumainak kezdőértékbeállítása, általánosabban az objektum-példány alaphelyzetbe állítása
Alapfogalmak
OOP_01
- 15 -