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: aroan@ektf.hu 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 aroan@ektf.hu 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 -
#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 1. Példa (C és C++) (csak egy verem) 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; procedure Init; V.vm := 0; End; procedure Push(x:real); V.tomb[V.vm]:=x; Inc(V.vm); End; function Pop:real; dec(v.vm); Pop := V.tomb[V.vm]; End; BEGIN Init; Push(12.5); Push(16.3); Writeln(Pop); // 16.3 Writeln(Pop); // 12.5 END. 1. Példa (Pascal) (csak egy verem) OOP_01-9 -
#include <stdio.h> struct TVerem int vm; float tomb[100]; ; void Init(TVerem *V) V->vm = 0; 2. Példa (C és C++) (több verem) void Push(TVerem *V, float x) V->tomb[V->vm]=x; V->vm++; 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)); 2. Példa (C és C++) (több verem) 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) V.vm = 0; End; procedure Push(var V:TVerem;x:real) V.tomb[V.vm]=x; Inc(V.vm); End; Function Pop(var V:TVerem):real; 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. Hiba! A stílus nem létezik. OOP_01-11 -
#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; 3. Példa (C++) (verem osztály) OOP_01-12 -
type TVerem=object vm:integer; tomb:array [1..100] of real; procedure Init; procedure Push(x:real); function Pop:real; end; procedure TVerem.Init; vm := 0; end; 3. Példa (Pascal) (verem osztály) procedure TVerem.Push(x:real); tomb[vm]:=x; inc(vm); end; function TVerem.Pop:real; 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. 3. Példa (Pascal) (verem osztály) 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 -