Sign in Join
Wiki copytemporary

Object Oriented Programming with Free Pascal and Lazarus/hu: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
1-<font size="6">Objektum-orientált programozás Free Pascal-lal és Lazarus-szal</font>
1+Objektum-orientált programozás Free Pascal-lal és Lazarus-szal
22
33## Bevezetés
44
55Rengeteg kitűnő tananyag található a Pascal-ról, de ennek a leírásnak a célja továbbvinni a kezdőket az [[Glossary|objektum-orientált programozás]] világába, ami a szabványos Pascal kiegészítése. Ezt a kiegészítést a Turbo-Pascal, a Delphi és a Free Pascal / Lazarus tartalmazza.
66
77Az [[Glossary|Objektum]] a szabványos Pascal-ban definiált [rekord](http://wiki.lazarus.freepascal.org/Record) struktúra kibővítése.
88
99A hagyományos szöveges módú Pascal programozás megfelelő olyan programok készítésére - mint például a hagyományos Unix alkalmazások -, amelyek egy dolgot tudnak csinálni, de azt nagyon jól. Az a bizonyos "egy dolog", amit az alkalmazás csinál elég bonyolult lehet, és akár több menüből elérhető lehetőséget kínálhat a felhasználónak, de alapvetően csak parancsok kiadására szorítkozik, amelyeket a felhasználó kiad a billentyűzet segítségével, és a választ a monitoron vagy a nyomtatón kapja meg.
1010
1111Ahhoz, hogy egy [[Glossary|grafikus felhasználói felületet (GUI)]] hozzunk létre, általában szükséges bevonni a dolgokba valamilyen objektum-orientált programozási metódust (gyakran a [[Glossary|C]] nyelv vagy valamelyik variánsának használatával, Visual Basic-kel, vagy valamelyik [[Glossary|OO]] variánsával a Pascal-nak, úgymint a [[Glossary|Free Pascal]] a [[Glossary|Lazarus]]-szal vagy nélküle).
1212
1313Egy GUI-ban a felhasználónak rendelkezésére áll egy képernyő, nagy mennyiségű szervezetten elrendezett képpel és ikonnal, amelyek eszközkészletekből, [[Glossary|Widget]]-ekből állnak, amelyekhez különféle események vannak hozzárendelve, úgy mint
1414
1515- kiválasztás egy menüből,
1616- fájlok megnyitása, vagy mentése,
1717- csatlakozás az internethez,
1818- numerikus műveletek végrehajtása, stb.
1919
2020A felhasználó feladata mozgatni az egeret vagy kijelölő eszközt a képernyőn, hogy eseményeket válasszon ki, amelyek végrehajtódnak egérgomb-, vagy billentyű lenyomására.
2121
2222Annak ellenére, hogy minden komplex grafikus felhasználói felülettel rendelkező rendszer megírható Pascal-ban, vagy bármely más nyelven, sokkal egyszerűbb objektum-orientált rendszert használni, ahol minden grafikus objektumnak a képernyőn lehetnek saját tulajdonságai és függvényei, így együtt egy összefüggő szerkezetet alkotva.
2323
2424Már a tárgyalás elején le kell szögeznünk az osztály és az objektum közötti fontos logikai különbséget: az osztály egy leírás, amely alapján a fordító példányosítás segítségével létrehozza az objektumot.
2525
2626Sajnos Pascal-ban ez az egyszerű logika csorbát szenved, mert object (objektum) és class (osztály) is deklarálható, illetve példányosítható. A kettő között a különbséget a futási időben elfoglalt memóriaterület helye jelenti: az osztály (class) egy objektumra mutató mutató (pointer). Ez azt jelenti, hogy az osztály a program HEAP területén helyezkedik el, míg az objektum a stack-en.
2727
2828Ennek ellenére - mivel az object típust ritkán alkalmazzuk - nyugodtan használhatjuk az első logikai gondolatmenetet.
2929
3030## Objektumok - a való világ analógiája
3131
3232Vegyük például a vérminta analógiáját, amit egy kórházban vagy az orvosi rendelőben gyűjtenek be.
3333
3434### Vérminta
3535
3636A minta fizikálisan természetesen egy **objektum**; létezik - vele összefüggésben - rengeteg információ, dokumentum, és egyéb fizikai objektum.
3737
3838- **Kémcső**, olyan típusú, amelyet a teszt előír.
3939
4040- **Helyi szabályozás** (vagy *metódus*, *szabványos művelet*) amely a nővér vagy technikus munkáját irányítja
4141 - milyen kémcsövet használjon,
4242 - hogyan dolgozza fel a mintát
4343 - hogyan tárolja a laborba való szállításig.
4444
4545- **Címke** a kémcsövön a részletekkel:
4646 - minta azonosító
4747 - a páciens neve és születési dátuma
4848 - a mintavétel időpontja
4949 - a szükséges tesztek.
5050
5151- **Igénylőlap**, amivel a mintát a laborba küldik:
5252 - minta azonosító
5353 - az igénylő azonosítója
5454 - az igényelt vizsgálatok
5555 - bővebb információk a páciensről
5656 - a lehetséges diagnózis, amelynek a megerősítését kérik.
5757
5858Az igénylőlap másolatát elhelyezik a páciens kartonjában, hogy emlékeztesse az orvost arra, hogy adott időn belül eredményeket fog kapni.
5959
6060- A laborban - **helyi metódusok**, amelyek meghatározzák:
6161 - hogyan kell a mintát analizálni,
6262 - milyen eszközöket kell használni,
6363 - hogyan kell az eszközöket kalibrálni, és működtetni,
6464 - milyen formában kell tárolni az eredményeket, és
6565 - hogyan kell visszajelenteni az orvosnak.
6666
6767A tényleges **eredmény** egy rekord, amelyet az orvos a diagnózis felállításához használ, továbbá egy másolat kerül elhelyezésre a páciens kartonjában.
6868
6969A fizikai minta megmaradhat referenciának, igazolásnak vagy további tesztekhez, vagy megsemmisítik valamilyen módon; ehhez egy további metódus szükséges, ami ennek a módját meghatározza.
7070
7171Nincs szükség orvosra, hogy kitalálja az összes részletet és utasítást minden alkalommal, amikor egy mintát begyűjtenek; sőt, lehet, hogy alig van tudomása arról, hogy hogyan értékelnek ki egy mintát a laborban. A különféle eljárások **öröklődnek** az előző mintavételekből és analízisekből - így lesz egy általános terv az egész folyamatra - és így együtt, az összes dokumentummal, adattal, és a hozzájuk tartozó metódusokkal a vérmintát, egy komplex **objektumként** tekinthetjük.
7272
7373Az orvos képzeletében, a vérminta többnyire ugyanannak az entitásnak jelenik meg, mint az eredményei. A nővéreknek és technikusoknak pedig a minta, a kémcső, a címke, és a tárolási feltételek szintén egy entitást jelentenek.
7474
7575### Egy másik példa - az automobil
7676
7777Ha nem szereted a vért, hasonló okfejtés használható egy autóra is. Ez a példa talán valamivel közérthetőbb. Az autónak a fizikai megjelenésén kívül, egyéb technikai paraméterei is vannak - ezek lesznek az autó objektumunk mezői. Az autónak működnie is kell valamilyen előre meghatározott leírás szerint. A működés több részfolyamatból áll, ezeket a részfolyamatokat nevezzük metódusoknak.
7878
7979Összefoglalva:
8080
8181Az autó mezői:
8282
8383- szín
8484- maximális sebesség
8585- sebességfokozatok száma
8686- ajtók száma
8787- utasok maximális száma
8888- az éppen bent ülő utasok száma
8989- aktuális sebesség
9090
9191Az autó metódusai:
9292
9393- motor indítás
9494- gyorsítás
9595- lassítás
9696- sebességváltás
9797
9898## Programozási példa
9999
100100Az elméleti fejtegetés után térjünk rá arra a kérdésre, hogy hogy néz ki programozási szempontból egy objektum! Ez a szekció ugyan fel van osztva részekre, de érdemesebb egyben olvasni a teljes kép megalkotásához.
101101
102102### Deklaráció
103103
104104Ehhez vegyük alapul az automobilunkat; először is leírást kell készítenünk a mezőkről és a metódusokról:
105105
106106``` pascal
107107 type
108108 TAutoMobil = class
109109
110110 { Mezők: }
111111
112112 FSzin: String; { Az autó színe. }
113113 FMaxSebesseg: Real; { Maximális sebesség. }
114114 FMaxUtasok: Integer; { Utasok maximális száma. }
115115 FAktualisSebesseg: Real; { Az aktuális sebesség. }
116116 FAktualisUtasok: Integer; { A bent ülő utasok maximális száma. }
117117
118118 { Metódusok: }
119119
120120 constructor Create(aSzin: String; aMaxSebesseg: Real; aMaxUtasok: Integer);
121121 procedure Gyorsit;
122122 procedure Lassit;
123123 end;
124124```
125125
126126### Implementáció
127127
128128Az előző példában jól látható a rekordhoz való hasonlóság, illetve az eltérés is abban, hogy itt már metódusok is lettek definiálva. A metódusokat és mezőket szintén a pont operátorral érhetjük el. Azonban ez a deklaráció még nem teljes! A metódusokat - akár a unit-oknál - ki kell fejtenünk a főprogram szekciójának megkezdése előtt:
129129
130130``` pascal
131131{ ...deklarációs rész... }
132132
133133constructor TAutoMobil.Create(aSzin: String; aMaxSebesseg: Real; aMaxUtasok: Integer);
134134begin
135135 Self.FSzin := aSzin;
136136 Self.FMaxSebesseg := aMaxSebesseg;
137137 Self.FMaxUtasok:= aMaxUtasok;
138138end;
139139
140140procedure TAutoMobil.Gyorsit;
141141begin
142142end;
143143
144144procedure TAutoMobil.Lassit;
145145begin
146146end;
147147
148148{ ...további programrészek... }
149149```
150150
151151Vegyük észre a *Self* saját magára mutató objektumot. Ennek a haszna az, hogy az aktuális objektum egy mezőjére hivatkozhatunk vele. A létjogosultsága abban rejlik, hogy a metódusokon belül deklarálható létező mezővel megegyező azonosítójú változó, illetve függvény; így azonban megkülönböztethetjük őket.
152152
153153### Példányosítás (konstruktor)
154154
155155Ne felejtsük el, hogy a deklaráció és a kifejtés még csak egy leírás - tervnek is tekinthetjük - az autóról. Ez azt jelenti, hogy még le kell gyártani - példányosítani kell. Erre szolgál az eddig talán ismeretlen *constructor* (konstruktor). Mint látható, nincs hozzá definiálva visszatérési érték, mégis értékadásra használjuk. Ennek az az oka, hogy alapértelmezetten egy pointer-rel és csak azzal térhet vissza. A pointer arra az objektumra mutat, amelyet létrehoztunk a konstruktorral. Talán kicsit bonyolultan hangzik elsőre, de lássuk a példát:
156156
157157``` pascal
158158var
159159 Auto: TAutoMobil;
160160
161161begin
162162 Auto := TAutoMobil.Create('Fekete', 160, 5);
163163end;
164164```
165165
166166Ezzel az egy sorral létrehoztuk az autónkat, amely fekete színű, 160 km/h a végsebessége, és 5 utas fér el benne. Ezek után már beindíthatjuk, gyorsíthatunk, lassíthatunk vele, stb.:
167167
168168``` pascal
169169var
170170 Auto: TAutoMobil;
171171
172172begin
173173 Auto := TAutoMobil.Create('Fekete', 160, 5);
174174
175175 Auto.Gyorsitas;
176176 Auto.Lassitas;
177177end;
178178```
179179
180180### Megsemmisítés (destruktor)
181181
182182Mielőtt továbbmennénk, el kell fogadnunk, hogy az autó egy veszélyes hulladék. Ezért a szabályos megsemmisítésről gondoskodnunk kell. Ez a megsemmisítés szintén egy metódus, amely leírja, hogy mi a teendő megsemmisítés esetén. Ezt a metódust hívjuk destruktornak (*destructor*). A destruktort szintén deklarálni kell, majd pedig kifejteni. Ezzel kibővítve a deklarációnkat:
183183
184184``` pascal
185185 type
186186 TAutoMobil = class
187187
188188 { Mezők: }
189189
190190 FSzin: String; { Az autó színe. }
191191 FMaxSebesseg: Real; { Maximális sebesség. }
192192 FMaxUtasok: Integer; { Utasok maximális száma. }
193193 FAktualisSebesseg: Real; { Az aktuális sebesség. }
194194 FAktualisUtasok: Integer; { A bent ülő utasok maximális száma. }
195195
196196 { Metódusok: }
197197
198198 constructor Create(aSzin: String; aMaxSebesseg: Real; aMaxUtasok: Integer);
199199 destructor Destroy;
200200 procedure Gyorsit;
201201 procedure Lassit;
202202 end;
203203```
204204
205205A destruktor programozástechnikai jelentősége abban rejlik, hogy az objektum által lefoglalt memóriaterületet felszabadítja. Ez a Pascal-nál (és C++-nál is) nagyon fontos, mivel nincs beépített szemétgyűjtő (mint pl. Java esetén), tehát a már nem szükséges objektumokat "kézzel" kell felszabadítanunk. Természetesen óvatosan kell eljárnunk, nehogy valahol még hivatkozzunk rá. A felszabadított objektumra való hivatkozás a program összeomlásával jár (SIGSEGV hiba), mivel nem létező objektumra mutatunk a hivatkozás során.
206206
207207Ha idáig nem megy készség szinten, ne is folytasd az olvasást, inkább próbáld értelmezni az előzőeket! :)
208208
209209### Tulajdonságok (property-k)
210210
211211Ha eddig minden érthető volt, akkor a dolgokat tovább kell bonyolítanunk azzal, hogy az autó, mint objektum, több egyéb objektumból áll - ezek például: motor, sebességváltó. Ha végig gondoljuk mindegyiknek vannak ugyanúgy mezői és metódusai. A motort, és a sebességváltót készen kapják az autógyárak, és beszerelik az autóba. Azonban ahhoz, hogy be tudják őket szerelni, helyet kell nekik biztosítani: mezőket kell létrehozni a deklarációban:
212212
213213``` pascal
214214 type
215215 TAutoMobil = class
216216
217217 { Mezők: }
218218
219219 FSzin: String; { Az autó színe. }
220220 FMaxSebesseg: Real; { Maximális sebesség. }
221221 FMaxUtasok: Integer; { Utasok maximális száma. }
222222 FAktualisSebesseg: Real; { Az aktuális sebesség. }
223223 FAktualisUtasok: Integer; { A bent ülő utasok maximális száma. }
224224 FMotor: TMotor; { Az autóba szerelt motor. }
225225 FSebessegValto: TSebessegValto; { Az autóba szerelt sebességváltó. }
226226
227227 { Metódusok: }
228228
229229 constructor Create(aSzin: String; aMaxSebesseg: Real; aMaxUtasok: Integer; aMotor: TMotor; aSebessegValto: TSebessegValto);
230230 destructor Destroy;
231231 procedure Gyorsit;
232232 procedure Lassit;
233233 end;
234234```
235235
236236Ez megjelenik a konstruktorban is paraméterként. Így már többféle modell legyártható pl. a motor megváltoztatásával. A sebességváltó vagy a motor cseréje szükséges lehet később is, de amit be szeretnénk szerelni, nem biztos, hogy kompatibilis! Ha kompatibilitási problémánk lehet, akkor nem célszerű közvetlenül az objektum mezőjének értéket adni, mert később komoly, és nehezen visszakövethető hibát okozhatunk vele. Ennek a kiküszöbölésére használhatjuk az objektum metódusait is, ahol értékadás előtt vizsgálatot hajtunk végre, illetve a Pascal-ban egy elegáns megoldás a tulajdonságok (*property*-k) használata, amelyek ezt megold(hat)ják helyettünk. Deklarálhatunk írható-olvasható, és csak olvasható tulajdonságokat is. Egy autó kapcsán szinte minden cserélhető egymással, de most kivételesen vegyük az alvázszámot nem megváltoztathatónak (mivel tilos megváltoztatni). Ezt a gyárban egyszer beütik, és onnantól a megsemmisítésig ugyanaz az érték marad. Ehhez a property, a read, és a write kulcsszókat kell használnunk:
237237
238238``` pascal
239239 type
240240 TAutoMobil = class
241241
242242 { Mezők: }
243243
244244 FSzin: String; { Az autó színe. }
245245 FMaxSebesseg: Real; { Maximális sebesség. }
246246 FMaxUtasok: Integer; { Utasok maximális száma. }
247247 FAktualisSebesseg: Real; { Az aktuális sebesség. }
248248 FAktualisUtasok: Integer; { A bent ülő utasok maximális száma. }
249249 FAlvazSzam: String; { A gyárban beütött alvázszám. }
250250 FMotor: TMotor; { Az autóba szerelt motor. }
251251 FSebessegValto: TSebessegValto; { Az autóba szerelt sebességváltó. }
252252
253253 { Metódusok: }
254254
255255 constructor Create(aSzin: String; aMaxSebesseg: Real; aMaxUtasok: Integer; aMotor: TMotor; aSebessegValto: TSebessegValto);
256256 destructor Destroy;
257257 procedure Gyorsit;
258258 procedure Lassit;
259259 procedure SetMotor(aMotor: TMotor);
260260 procedure SetSebessegValto(aSebessegValto: TSebessegValto);
261261
262262 { Tulajdonságok: }
263263
264264 property AlvazSzam: String read FAlvazSzam; { Csak olvasható tulajdonság. }
265265 property Motor: TMotor read FMotor write SetMotor; { Olvasható és írható tulajdonság. }
266266 property SebessegValto: TSebessegValto read FSebessegValto write SetSebessegValto;
267267 end;
268268```
269269
270270Ezek után nézzük, hogy mit is csinál pl. a SetSebessegValto fuggvény:
271271
272272``` pascal
273273{ ...deklarációs rész... }
274274
275275procedure TAutoMobil.SetSebessegValto(aSebessegValto: TSebessegValto);
276276begin
277277 if (IsCompatibleSebessegValto(aSebessegValto) = True) then
278278 begin
279279 Self.FSebessegValto := aSebessegValto;
280280 end
281281 else Self.FSebessegValto := null;
282282end;
283283
284284procedure TAutoMobil.Lassit;
285285begin
286286end;
287287
288288{ ...további programrészek... }
289289```
290290
291291A példában használt *IsCompatibleSebessegValto* függvény valahol az osztályon kívül definiált. A tartalmával nem fontos a példa szempontjából foglalkozni. A lényeg, hogy megállapítja, hogy a beszerelni kívánt sebességváltó kompatibilis-e az autóval. Ha igen, akkor bekerül, ha nem, akkor nem kerül be sebességváltó (feltételezzük, hogy a régi sebességváltó már ki lett szerelve).
292292
293293### Virtuális metódusok
294294
295295Megállapíthatjuk, hogy egy adott gyártó egy adott típusú automobilból gyárt többféle változatot, pl. mechanikus és elektromos gázpedállal is. Ebben az esetben az alapvető funkciók megegyeznek, de kicsi eltérések vannak. Ilyen alapvető funkciók pl. a gyorsítás, a lassítás, stb. Ezért ezeket a különböző példányokban különbözőképpen kell megvalósítani. Erre valók a virtuális metódusok, amelyeket a *virtual* kulcsszóval deklarálhatunk. Alapul véve az előbbi gondolatmenetet, így fog kinézni a TAutoMobil osztályunk:
296296
297297``` pascal
298298 type
299299 TAutoMobil = class
300300
301301 { Mezők: }
302302
303303 FSzin: String; { Az autó színe. }
304304 FMaxSebesseg: Real; { Maximális sebesség. }
305305 FMaxUtasok: Integer; { Utasok maximális száma. }
306306 FAktualisSebesseg: Real; { Az aktuális sebesség. }
307307 FAktualisUtasok: Integer; { A bent ülő utasok maximális száma. }
308308 FAlvazSzam: String; { A gyárban beütött alvázszám. }
309309 FMotor: TMotor; { Az autóba szerelt motor. }
310310 FSebessegValto: TSebessegValto; { Az autóba szerelt sebességváltó. }
311311
312312 { Metódusok: }
313313
314314 constructor Create(aSzin: String; aMaxSebesseg: Real; aMaxUtasok: Integer; aMotor: TMotor; aSebessegValto: TSebessegValto);
315315 destructor Destroy;
316316 procedure Gyorsit; virtual;
317317 procedure Lassit; virtual;
318318 procedure SetMotor(aMotor: TMotor);
319319 procedure SetSebessegValto(aSebessegValto: TSebessegValto);
320320
321321 { Tulajdonságok: }
322322
323323 property AlvazSzam: String read FAlvazSzam; { Csak olvasható tulajdonság. }
324324 property Motor: TMotor read FMotor write SetMotor; { Olvasható és írható tulajdonság. }
325325 property SebessegValto: TSebessegValto read FSebessegValto write SetSebessegValto;
326326 end;
327327```
328328
329329A *virtual* kulcsszóval deklarált függvényeket később az öröklődés során létrehozott gyerek osztályok metódus implementációiban módunkban áll módosítani. Ha nem tesszük meg, akkor automatikusan a szülő osztályban implementált metódus fog lefutni.
330330
331331### Absztrakt metódusok
332332
333333Az automobilról mindenkinek ugyanaz a kép jut eszébe, azonban különböző gyártók különböző modelleket gyártanak, amelyek működésben is eltérhetnek egymástól. Úgy is fogalmazhatnánk, hogy attól még, hogy mi magunk is tudjuk, hogy nagyjából hogyan néz ki és működik egy autó, legyártani nem tudnánk. Tehát az automobilt egy absztrakt fogalomként kell értelmezni. Erre való az *abstract* kulcsszó használata:
334334
335335``` pascal
336336 type
337337 TAutoMobil = class
338338
339339 { Mezők: }
340340
341341 FSzin: String; { Az autó színe. }
342342 FMaxSebesseg: Real; { Maximális sebesség. }
343343 FMaxUtasok: Integer; { Utasok maximális száma. }
344344 FAktualisSebesseg: Real; { Az aktuális sebesség. }
345345 FAktualisUtasok: Integer; { A bent ülő utasok maximális száma. }
346346 FAlvazSzam: String; { A gyárban beütött alvázszám. }
347347 FMotor: TMotor; { Az autóba szerelt motor. }
348348 FSebessegValto: TSebessegValto; { Az autóba szerelt sebességváltó. }
349349
350350 { Metódusok: }
351351
352352 constructor Create(aSzin: String; aMaxSebesseg: Real; aMaxUtasok: Integer; aMotor: TMotor; aSebessegValto: TSebessegValto); virtual; abstract;
353353 destructor Destroy; virtual; abstract;
354354 procedure Gyorsit; virtual; abstract;
355355 procedure Lassit; virtual; abstract;
356356 procedure SetMotor(aMotor: TMotor); virtual; abstract;
357357 procedure SetSebessegValto(aSebessegValto: TSebessegValto); virtual; abstract;
358358
359359 { Tulajdonságok: }
360360
361361 property AlvazSzam: String read FAlvazSzam; { Csak olvasható tulajdonság. }
362362 property Motor: TMotor read FMotor write SetMotor; { Olvasható és írható tulajdonság. }
363363 property SebessegValto: TSebessegValto read FSebessegValto write SetSebessegValto;
364364 end;
365365```
366366
367367Erre a célra azonban megfelelőbb az interfészek használata.
368368
369369### Öröklődés
370370
371371A gyártók azonban a birtokában vannak az absztrakt fogalmak mögött rejlő tudásnak, ezért a saját elképzeléseik és tudásuk hozzáadásával egyedi automobilokat hoznak létre. Ezt nevezzük öröklődésnek (*inheritance*). Ennek megértéséhez be kell vezetnünk a szülő (*parent*) és gyerek (*child*) fogalmakat. Ez programozási szempontból a következőképpen néz ki, ha pl. a Mercedes gyárról beszélünk:
372372
373373``` pascal
374374 type
375375 TMercedesAutoMobil = class(TAutoMobil)
376376
377377 FLegzsakokSzama: Integer;
378378
379379 procedure Gyorsit; override;
380380 procedure Lassit; override;
381381 end;
382382```
383383
384384A *class* kulcsszó utáni zárójelben adjuk meg a szülő osztály nevét. Tehát a szülő osztály a TAutoMobil, a gyerek pedig a TMercedesAutoMobil lesz, amely örökölni fogja a szülő mezőit, metódusait és tulajdonságait. Ebben az esetben a Mercedes gyárnak kell meghatározni (programozási szempontból kifejteni) az *abstract* kulcsszóval ellátott metódusokat. Ehhez a deklarációs részben a metódusok után az *override* kulcsszót kell használni. Az absztrakt metódusok kifejtése mellett további mezők is kerülnek a gyerek objektumba, pl. a légzsákok száma - ami ugye nem feltétlenül része egy autónak (gondoljunk a régebbi modellekre). Ez az eljárás magával hozza azt a kérdést is, hogy mégis milyen tulajdonságokat, metódusokat örököljön majd a gyerek? Hogyan lehetne ezt definiálni? Erre valók a láthatóságot (*visibility*) definiáló kulcsszavak.
385385
386386Folytatás hamarosan...
387387
388388## Free Pascal Language Extensions
389389
390390FPC includes several language extensions to its "standard" Pascal syntax to support object oriented programming.
391391
392392- Objects (chapter 5) [[Programming Using Objects]]
393393- Classes (chapter 6) [[Programming Using Classes]]
394394- Interfaces (chapter 7) [[Programming Using Interfaces]]
395395- Generics (chapter 8) [[Programming Using Generics]]
396396
397397These extensions are described in the indicated chapters of the FPC Language Reference Guide: <http://www.freepascal.org/docs.var>. Links to tutorial pages for each concept are included above as well. The Language Reference Guide includes syntax diagrams and further details not contained in this introductory tutorial. Of the four language features listed above, **Objects** and **Classes** form the basis of object oriented programming (OOP) in FPC and Lazarus. For those new to OOP, the **Objects** section includes more introductory concepts and the **Classes** section minimizes repetition by emphasizing the similarities and differences to the **Objects** syntax. In general, the **Classes** implementation seems to be more widely in use including Delphi Lazarus developers. Often the word "objects" is used to refer to what is actually a "class" in the **Classes** dialect of OOP in FPC. These documents will be worded to minimize any terminology confusion, but outside of this document, the term "object" oftentimes refers to objects created from a **Class**. In fact, the FPC run time library (RTL) includes a class library with a base **class** called *TObject*.
398398
399399Users familiar with the older Turbo Pascal OOP implementation may initially want to skip the section on Classes since the Objects implementation is based on the older Turbo Pascal dialect. The section on **Classes** should be familiar to Delphi users since it is based on Delphi syntax. Be aware that some of the writeup in the **Classes** section may refer to concepts from the **Objects** section. For Macintosh developers familiar with the various Apple, THINK and MPW Object Pascal dialects, neither the FPC Objects or Classes dialects provide a direct migration path. As of March 2009, there are discussions on the Mac Pascal Mailing list about potentially providing some compiler support (new syntax) for accessing Apple's Objective C / Cocoa framework.
400400
401401### General Concepts of Object Oriented Pascal
402402
403403OOP provides different ways to manage and encapsulate data and to manage program flow compared with other available programming language features and constructs. OOP often lends itself to modeling certain applications such as Graphic User Interfaces (GUI's) and physical systems in a more natural feeling manner. However OOP is not appropriate for all applications. Program control is not as explicit as the more basic Pascal procedural constructs. To obtain the most benefit from OOP, understanding of large class libraries is often required which can entail a steep learning curve. Maintaining large OOP application code has its advantages and disadvantages compared to maintaining strictly procedural code. There are many sources for learning OO analysis, design and programming techniques which are beyond the scope of this guide.
404404
405405There are numerous programming languages which incorporate OOP features as extensions or the basis of their language. As such, there are many different terms for describing OO concepts. Even within FPC, some of the terminology overlaps. In general, OOP usually consists of the concept of a programming object (or information unit) which explicitly combines and encapsulates a related set of data and procedures which act on the data. This data is usually persistent during program execution but with mechanisms to reduce some of the problems inherent in declaring global variables. In addition, OOP languages enable objects to be incrementally modified and/or extended based on previously defined objects. This feature is usually referred to by the terms *inheritance* and *polymorphism*. Many OOP languages use the terms *method* or *message* referring to procedures which belong to an object. Much of the power of OOP is realized by late (run time) dynamic binding of methods rather than compile binding. This dynamic binding of methods is similar to using procedural variables and procedural parameters but with greater syntactic cohesion, encapsulation with the data it is related to and also inheritance of behavior of previously defined methods. The following wiki pages provide a starting point for discovering more about analysis, design and programming in an object orient manner.
406406
407407## Further information
408408
409409This has only scratched the surface of the topic. For more details, readers are strongly recommended to read the [Free Pascal](http://lazarus-ccr.sourceforge.net/fpcdoc/ref/ref.html) manuals, especially Chapters 5 (**Objects**) and 6 (**Classes**)
410410
411411## See Also
412412
413413- [[Console Mode Pascal]]
414414
415415## External Links
416416
417417- <http://en.wikipedia.org/wiki/Object-oriented_programming>
418418- <http://en.wikipedia.org/wiki/OOAD>
419419- <http://en.wikipedia.org/wiki/Object_oriented_design>
420420
421421---
422422*From the Free Pascal wiki, page "Object Oriented Programming with Free Pascal and Lazarus/hu", as it stood on 2020-02-21 after a change by Trev, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history