12. előadás Szinkronizációs feladatok (2). Védett egységek. Álvéletlenszámok. OOP az Adában.

Slides:



Advertisements
Hasonló előadás
C# nyelvi áttekintő A „Programozás C# nyelven (Illés Zoltán)”
Advertisements


Kamarai prezentáció sablon
Készítette: Boros Erzsi
C++ programozási nyelv Gyakorlat hét
Erőállóképesség mérése Találjanak teszteket az irodalomban
MATEMATIKA Év eleji felmérés 3. évfolyam
Összefoglalás 1. Pascal program szerkezete 2. Pascal típusai
Humánkineziológia szak
Mellár János 5. óra Március 12. v
Elektromos mennyiségek mérése
Utófeszített vasbeton lemez statikai számítása Részletes számítás
JavaScript.
© Kozsik Tamás Beágyazott osztályok A blokkstrukturáltság támogatása –Eddig: egymásba ágyazható blokk utasítások Osztálydefiníciók is egymásba.
Szabó Tamás Károly G6HT12 A Ruby programozási nyelv.
Programozás alapjai.
A tételek eljuttatása az iskolákba
Csala Péter ANDN #4. 2 Tartalom  C# - ban előre definiált típusok  Változók  Változókkal műveletek  Elágazás  Ciklus.
Programozás II. 3. Gyakorlat C++ alapok.
VÁLOGATÁS ISKOLÁNK ÉLETÉBŐL KÉPEKBEN.
Védőgázas hegesztések
1. IS2PRI2 02/96 B.Könyv SIKER A KÖNYVELÉSHEZ. 2. IS2PRI2 02/96 Mi a B.Könyv KönyvelésMérlegEredményAdóAnalitikaForintDevizaKönyvelésMérlegEredményAdóAnalitikaForintDeviza.
A Java programozási nyelvSoós Sándor 1/17 Java programozási nyelv 4. rész – Osztályok II. Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai.
Java programozási nyelv 5. rész – Osztályok III.
C# tagfüggvények.
C# tagfüggvények.
Reprezentációs függvény. Adva egy adattípus absztrakt és konkrét specifikációja: d a = ( A, F, E a ); d c = ( C, G, E c ); A = {A 0,..., A n };C = {C 0,...,
10. előadás Párhuzamos programozási kérdések. Az Ada taszkok (1).
6. előadás Parametrikus polimorfizmus. Generikus programozás. Az Ada sablonok.
5. előadás Parametrikus polimorfizmus. Generikus programozás
Az Input-Output használata Az input-outputot a nyelv előredefiniált csomagokon keresztül valósítja meg. Mindegyik csomag az Ada alapcsomag gyereke.
11. előadás Szinkronizációs feladatok. Az Ada taszkok (2).
8. előadás Dinamikus memóriakezelés. Mutatók. Láncolt adatszerkezetek.
10. előadás Párhuzamos programozási kérdések. Az Ada taszkok (1).
2. előadás Programegység, fordítási egység, könyvtári egység, beágyazás, blokkszerkezet, alprogramok, csomagok.
6. előadás Hatókör, láthatóság, élettartam. Változók leképzése a memóriára. Blokkszerkezetes nyelvek. Kivételkezelés.
5. előadás Parametrikus polimorfizmus. Generikus programozás. Az Ada sablonok.
4. előadás Az Ada típusai és típuskonstrukciós eszközei, II. Rekordok és átlátszatlan típusok. A csomagok. Adatabsztrakció, egységbe zárás.
Szerkezeti elemek teherbírásvizsgálata összetett terhelés esetén:
4. előadás Az Ada típusai és típuskonstrukciós eszközei, II
Sárgarépa piaca hasonlóságelemzéssel Gazdaság- és Társadalomtudományi kar Gazdasági és vidékfejlesztési agrármérnök I. évfolyam Fekete AlexanderKozma Richárd.
NOVÁK TAMÁS Nemzetközi Gazdaságtan
DRAGON BALL GT dbzgtlink féle változat! Illesztett, ráégetett, sárga felirattal! Japan és Angol Navigáláshoz használd a bal oldali léptető elemeket ! Verzio.
szakmérnök hallgatók számára
Logikai szita Izsó Tímea 9.B.
Alprogramok deklarációja, definíciója és meghívása Páll Boglárka.
Összetett adattípusok a Pascal nyelvben
2007. május 22. Debrecen Digitalizálás és elektronikus hozzáférés 1 DEA: a Debreceni Egyetem elektronikus Archívuma Karácsony Gyöngyi DE Egyetemi és Nemzeti.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
A pneumatika alapjai A pneumatikában alkalmazott építőelemek és működésük vezérlő elemek (szelepek)
Csurik Magda Országos Tisztifőorvosi Hivatal
A klinikai transzfúziós tevékenység Ápolás szakmai ellenőrzése
QualcoDuna interkalibráció Talaj- és levegövizsgálati körmérések évi értékelése (2007.) Dr. Biliczkiné Gaál Piroska VITUKI Kht. Minőségbiztosítási és Ellenőrzési.
Termelő-fogysztó modell. A probléma absztrakt megfogalmazása: informális leírás. Adott egy N elemű közösen használt tároló, N  1. Adott a folyamatoknak.
Egyenesvonalú (lineáris) adatszerkezetek
1 Objektum orientált programozás Öröklődés: többszörös öröklődés, konstruktorok, destruktorok, overloading Nagy Szilvia.
Objektum orientált programozás
1. Melyik jármű haladhat tovább elsőként az ábrán látható forgalmi helyzetben? a) A "V" jelű villamos. b) Az "M" jelű munkagép. c) Az "R" jelű rendőrségi.
A Visual Basic nyelvi elemei
> aspnet_regiis -i 8 9 TIPP: Az „Alap” telepítés gyors, nem kérdez, de később korlátozhat.
A KÖVETKEZŐKBEN SZÁMOZOTT KÉRDÉSEKET VAGY KÉPEKET LÁT SZÁMOZOTT KÉPLETEKKEL. ÍRJA A SZÁMOZOTT KÉRDÉSRE ADOTT VÁLASZT, VAGY A SZÁMOZOTT KÉPLET NEVÉT A VÁLASZÍV.
1 Az igazság ideát van? Montskó Éva, mtv. 2 Célcsoport Az alábbi célcsoportokra vonatkozóan mutatjuk be az adatokat: 4-12 évesek,1.
Adva S  parbegin S 1 ...  S n parend; Párhuzamos programszerkezet két vagy több olyan folyamatot tartalmaz, amelyek egymással közös változó segítségével.
5. előadás Parametrikus polimorfizmus. Generikus programozás. Az Ada sablonok.
Excel programozás (makró)
Félcsoport (semigroup) = ({s},{ *: s s  s [infix]}. semigroup is a type specification = sorts: s oprs: *: s s  s [infix] eqns: m 1, m 2, m 3  s (m 1.
11. előadás Szinkronizációs feladatok. Az Ada taszkok (2).
12. előadás Szinkronizációs feladatok (2). Védett egységek
10. előadás Párhuzamos programozási kérdések. Az Ada taszkok (1).
JAVA programozási nyelv NetBeans fejlesztőkörnyezetben I/13. évfolyam
Előadás másolata:

12. előadás Szinkronizációs feladatok (2). Védett egységek. Álvéletlenszámok. OOP az Adában.

2 Az evő filozófusok problémája n Dijkstra: dining philosophers n Erőforráshasználat modellezése – Erőforrások: villák – Folyamatok: filozófusok n Holtpont kialakulása n Általánosítás: ivó filozófusok

3 Holtpont n Deadlock n Ha a folyamatok egymásra várnak n Tranzakciók n Elkerülés – Például a szimmetria megtörésével n Erőforrások lekötése rendezés szerint n Véletlenszerű időkorlátok n Felismerés és megszüntetés (abort)

4 A villák (erőforrások) modellezése task type Villa is entry Felvesz; entry Letesz; end Villa; task body Villa is begin loop accept Felvesz; accept Letesz; end loop; end Villa;

5 A filozófusok (folyamatok) Villák: array (1..5) of Villa; task type Filozófus ( Bal, Jobb: Positive ); Platon: Filozófus(1,2); Arisztotelész: Filozófus(2,3); Descartes: Filozófus(3,4); Kant: Filozófus(4,5); Hegel: Filozófus(5,1);

6 Véletlenszerű időkorlát (1) task body Filozófus is procedure Éhes_Vagyok is … end Éhes_Vagyok; begin loop -- gondolkodom Éhes_Vagyok; -- eszem Villák(Bal).Letesz; Villák(Jobb).Letesz; end loop; end Filozófus;

7 Véletlenszerű időkorlát (2) procedure Éhes_Vagyok is Ehetek: Boolean := False; begin while not Ehetek loop Villák(Bal).Felvesz; select Villák(Jobb).Felvesz; Ehetek := True; ordelay Véletlen_Idő; Villák(Bal).Letesz; end select; end loop; end Éhes_Vagyok;

8 „Véletlenszámok” n Álvéletlenszámok (pseudo-random numbers) n Valamilyen (determinisztikus) algoritmussal n Float vagy diszkrét típusú – Ada.Numerics.Float_Random (csomag) – Ada.Numerics.Discrete_Random (sablon csomag) n Generator, Reset, Random stb. n Szimulációkhoz n Taszkok esetén: szinkronizáltan

9 Float_Random with Ada.Numerics.Float_Random; use Ada.Numerics.Float_Random; … G: Generator; … Reset(G);Reset(G,100); … F: Float := Random(G); …

10 Discrete_Random (egész) with Ada.Numerics.Discrete_Random; … type Intervallum is new Integer range ; package Intervallum_Random is new Ada.Numerics.Discrete_Random(Intervallum); use Intervallum_Random; G: Generator; … Reset(G);Reset(G,100); … F: Intervallum := Random(G); …

11 Discrete_Random (felsorolási) with Ada.Numerics.Discrete_Random; … type Alapszín is (Piros, Sárga, Kék); package Alapszín_Random is new Ada.Numerics.Discrete_Random(Alapszín); use Alapszín_Random; G: Generator; … Reset(G);Reset(G,100); … F: Alapszín := Random(G); …

12 Monitorral védetten task body Véletlen is G: Ada.Numerics.Float_Random.Generator; begin Reset(G); loop select accept Random ( F: out Float ) do F := Random(G); end Random; orterminate; end select; end loop; end Véletlen; task Véletlen is entry Random ( F: out Float ); end Véletlen;

13 A véletlenszerű várakozáshoz Villák: array (1..5) of Villa; task Véletlen is entry Random( F: out Float ); end; … function Véletlen_Idő return Duration is F: Float; begin Véletlen.Random(F); return Duration(F); end Véletlen_Idő; task type Filozófus ( Bal, Jobb: Positive ); …

14 Író-olvasó feladat n Van egy több folyamat által használt erőforrás n Lehet változtatni („írni”) és lekérdezni („olvasni”) n Az olvasások mehetnek egyidőben n Az írás kizárólagos n A monitornál megengedőbb

15 Megvalósítás Adában n Taszkok segítségével – Bonyolult – Kell pár select bele – Igazságosság, pártatlanság (fairness) n Védett egységgel

16 Kiéheztetés n Livelock, starvation n Nincs holtpont (deadlock) n Fut a rendszer n De: egy folyamat mindig rosszul jár n Nem képes elvégezni a feladatát n Példa: ügyetlen „evő filozófusok” megvalósításnál – Szimmetria megtörése a filozófusok beszámozásával – A kisebb sorszámú előnyt élvez a nagyobb sorszámúval szemben n Példa: ügyetlen „író-olvasó” megvalósításnál – Az olvasók könnyen kiéheztethetik az írókat

17 Író-olvasó: Ada taszk segítségével (1) task Scheduler is entry Start_Reading; entry Start_Writing; entry Stop_Reading; entry Stop_Writing; end Scheduler; n Szemafor-szerű

18 Író-olvasó: Ada taszk segítségével (2) task body Reader_Writer is begin loop Scheduler.Start_Reading; -- itt olvashatom az erőforrást Scheduler.Stop_Reading; … Scheduler.Start_Writing; -- itt írhatom az erőforrást Scheduler.Stop_Writing; end loop; end Reader_Writer ;

19 Író-olvasó: Ada taszk segítségével (3) task body Scheduler is Nr_Of_Readers: Natural := 0; Writing: Boolean := False; begin loop select… accept Start_Reading … or… accept Start_Writing … … or terminate; end select; end loop; end Scheduler;

20 Író-olvasó: Ada taszk segítségével (4) select when not Writing => accept Start_Reading; Nr_Of_Readers := Nr_Of_Readers + 1; orwhen (not Writing) and then (Nr_Of_Readers = 0) => accept Start_Writing; Writing := True; oraccept Stop_Reading; Nr_Of_Readers := Nr_Of_Readers - 1; oraccept Stop_Writing; Writing := False; or terminate; end select; az írók éhezhetnek

21 Író-olvasó: Ada taszk segítségével (5) select when (not Writing) and then (Start_Writing’Count = 0) => accept Start_Reading; Nr_Of_Readers := Nr_Of_Readers + 1; orwhen (not Writing) and then (Nr_Of_Readers = 0) => accept Start_Writing; Writing := True; oraccept Stop_Reading; Nr_Of_Readers := Nr_Of_Readers - 1; oraccept Stop_Writing; Writing := False; or terminate; end select; az olvasók éhezhetnek

22 Író-olvasó: Ada taszk segítségével (6) n Egy ügyesebb stratégia: – Egy sorban tároljuk a bejövő olvasási és írási kérelmeket – A sor elején álló olvasókat (az első íróig) engedjük egyszerre olvasni – Ha a sor elején író áll, akkor engedjük írni n Ebben nincs kiéheztetés n Bizonyos olvasó folyamatokat nem engedek olvasni, amikor pedig épp „olvasási szakasz” van

23 Író-olvasó védett egységgel n Sokkal egyszerűbb n Nincs szükség Scheduler taszkra n Nincs szükség az írókban és olvasókban a kritikus szakasz kijelölésére n Az erőforrás köré szinkronizációs burok n Védett egység n A monitor továbbfejlesztése író-olvasóhoz

24 A védett egység protected Erőforrás is function Olvas return Adat; procedure Ír( A: in Adat ); private X: Adat; end Erőforrás; … protected body Erőforrás is function Olvas return Adat is begin return X; end; procedure Ír( A: in Adat ) is begin X := A; end; end Erőforrás; a védett adat

25 Szinkronizáció a védett egységre n A függvények egyidőben n Az eljárásokra kölcsönös kizárás – egy eljárással egyidőben nem lehet: n sem másik eljárás n sem függvény n Feltételezés: a függvények mellékhatásmentesek

26 Védett egység és monitor task Monitor is entry M1 (... ); end Monitor; task body Monitor is begin loop select accept M1 (... ) do … end; or accept M2 (... ) do … end; or terminate; end select; end loop; end Monitor; protected Monitor is procedure M1 (... ); end Monitor; protected body Monitor is procedure M1 (... ) is … end; end Monitor; … Monitor.M1(…); Monitor.M2(…); …

27 Belépési pontok n Az eljárások és függvények mellett n Kölcsönös kizárás teljesül rá n Feltétel szabható rá n Várakozási sor entry E (…) when Feltétel is … begin … end E; nem függhet a paraméterektől

28 Termelő-fogyasztó (korlátlan buffer) protected Osztott_Sor is procedure Betesz ( A: in Adat ); entry Kivesz ( A: out Adat ); private S: Sor; end Osztott_Sor; protected Osztott_Sor is procedure Betesz ( A: in Adat ) is begin Betesz(S,A); end Betesz; entry Kivesz ( A: out Adat ) when not Üres(S) is begin Kivesz(S,A); end Kivesz; end Osztott_Sor;

29 Védett objektum és védett típus n Mint a taszk és a taszk típus n A típus – korlátozott – diszkrimináns(oka)t tartalmazhat (diszkrét vagy mutató) – cím szerint átadandó protected type Osztott_Sor( Kapacitás: Positive ) is entry Betesz ( A: in Adat ); entry Kivesz ( A: out Adat ); private S: Sor(Kapacitás); end Osztott_Sor; korlátos buffer

30 Védett egységek n Programegységek n Specifikáció és törzs szétválik (csomag, sablon, taszk) n Hasonlóság a taszkokkal: nem lehet könyvtári egység, csak beágyazva n Hasonlóság a csomagokkal: private rész n Megkötések: nem lehet benne például típus vagy csomag definíciója

31 „Szervernek” megírt taszkok helyett task (type) T is entry P; entry E; end T; task body T is X: Adat; begin loop select accept P … or when Feltétel => accept E … or terminate; end select; end loop; end T; protected (type) T is procedure P; entry E; private X: Adat; end T; protected body T is procedure P is … entry E when Feltétel is … end T;

32 Taszkok versus védett egységek n Monitor taszk helyett védett egység: tömörebb, kényelmesebb n Hatékonyabb – nincs külön végrehajtási szál – a hívott kód végrehajtása a hívó taszkban – a védett egység passzív, csak szinkronizál – kevesebb kontextusváltás kell n Író-olvasó is triviális

33 Működési elv: író-olvasó n Függvény mehet, ha – nem fut eljárás vagy entry törzse n Eljárás mehet, ha – nem fut függvény, eljárás vagy entry törzse n Entry törzse mehet, ha – nem fut függvény, eljárás vagy entry törzse – és az őrfeltétel teljesül

34 Várakozási sorok n Minden belépési ponthoz n Ha a védett egységbe belépéskor az őrfeltétel hamis, ide kerül a folyamat n Ha véget ér egy eljárás vagy entry törzs, az őrfeltételek újra kiértékelődnek

35 Kétszintű várakoztatás n A folyamatok várni kényszerülhetnek arra, – hogy a védett egységbe bejussanak (mutex) – egy entry törzsébe bejussanak (őrfeltétel) n Egy entry várakozási sorában álló folyamat előnyben van a még be sem jutottakkal szemben n Példa: üzenetszórásos szignál

36 Üzenetszórásos szignál n Broadcast signal n Folyamatok várnak egy eseményre n Blokkolódnak, amíg az esemény be nem következik n Az esemény bekövetkeztekor szignál n Ada megvalósítás: védett egység + requeue

37 A requeue utasítás n Egy entry törzsében használható n A hívást átirányítja – egy másik belépési ponthoz – akár másik védett egységbe vagy taszkba – akár visszairányítja önmagára n A másik entry: – vagy paraméter nélküli – vagy ugyanazokkal a paraméterekkel

38 Üzenetszórásos szignál Adában (1) protected Esemény is entry Vár; -- itt állnak sorban, akik az üzenetet szeretnék entry Jelez; -- jelzés, hogy bekövetkezett private entry Alaphelyzet; -- lokális belépési pont Megtörtént: Boolean := False; end Esemény;

39 Üzenetszórásos szignál Adában (2) protected body Esemény is entry Vár when Megtörtént is begin null; end Vár; entry Jelez when True is begin Megtörtént := True; requeue Alaphelyzet; end Jelez; entry Alaphelyzet when Vár'Count = 0 is begin Megtörtént := False; end Alaphelyzet; end Esemény;

40 Belépésipont-családok n Belépési pontokból álló tömb n Taszkban és védett egységben is lehet type Prioritás is (Magas, Közepes, Alacsony); task Kijelző is entry Üzenet(Prioritás) ( Szöveg: in String ); end Kijelző; accept Üzenet(Magas) ( Szöveg: in String ) do... end; Kijelző.Üzenet(Magas)(”Nemsokára ZH!”);

41 Védett egységben entry-család (1) type Prioritás is (Alacsony, Közepes, Magas); protected Kijelző is entry Üzenet (Prioritás) (Szöveg: in String ); end Kijelző; n Hívás: Kijelző.Üzenet(Magas)("Nemsokára ZH!");

42 Védett egységben entry-család (2) protected body Kijelző is function Mehet ( Aktuális: Prioritás ) return Boolean is… entry Üzenet (for Aktuális in Prioritás) (Szöveg: in String) when Mehet(Aktuális) is begin Put_Line(Prioritás'Image(Aktuális) & Ascii.HT & Szöveg); end Üzenet; end Kijelző;

43 Védett egységben entry-család (3) function Mehet ( Aktuális: Prioritás ) return Boolean is Fontosabb: Prioritás := Prioritás'Last; begin while Fontosabb > Aktuális loop if Üzenet(Fontosabb)'Count > 0 then return False; end if; Fontosabb := Prioritás'Pred(Fontosabb); end loop; return True; end Mehet;

44 Egymásba ágyazott randevúk n Egy taszk törzsében bárhol elhelyezhető accept utasítás – de csak a törzsben, alprogramjában már nem n Akár még egy randevún belül is – „accept E” –ben nem lehet másik „accept E” n Sőt, egy hívás is lehet randevún belül n Nagyon veszélyes, több taszk is várni kezd – Holtpont is könnyen kialakulhat n Megfontoltan csináljunk csak ilyet – Pl. kössük időkorláthoz a belső randevút n Védett egységben egyáltalán ne csináljunk ilyet

45 OOP az Adában n Adatabsztrakció, egységbe zárás n Konstruktor-destruktor mechanizmus n Öröklődés (+kiterjesztés) n Műveletek felüldefiniálása, dinamikus kötés n Altípusos polimorfizmus n Nem szokványos módon

46 Adatabsztrakció, egységbe zárás n Csomagok segítségével n Átlátszatlan típus definiálható n Külön fordítható műveletmegvalósítások n Paraméteres adattípus: sablon csomagban n Egység biztonságos kinyitása: gyerekcsomag

47 Konstruktor-destruktor n A Controlled, illetve Limited_Controlled típusokkal n Initialize, Adjust és Finalize eljárások n Tipikusan láncolt adatszerkezetek megvalósításához n Az Initialize nem létrehoz paraméterek alapján, hanem „rendbetesz”

48 Öröklődés, felüldefiniálás n Típusszármaztatással n A típusértékhalmaz és a primitív műveletek lemásolódnak n Műveletek felüldefiniálhatók n Újabb műveletekkel kiterjeszthető n Publikus és privát öröklődés is lehetséges n Adattagokkal való kiterjesztés?

49 Jelölt (tagged) rekordok n Származtatásnál újabb mezőkkel bővíthető n Cím szerint átadandó típus type Alakzat is tagged record Színe: Szín; end record; type Pont is new Alakzat with record X, Y: Float; end record;

50 Típusszármaztatás és konverzió n A típusszármaztatás új típust hoz létre n A régi és az új között konvertálhatunk n Csak explicit konverzióval type Int is new Integer; I: Integer := 3; J: Int := Int(I); K: Integer := Integer(J);

51 Konverzió jelölt típusokra type Alakzat is tagged record … type Pont is new Alakzat with record … P: Pont := (Piros, 3.14, 2.73); A: Alakzat := Alakzat(P); -- csonkol P := (A with X => 2.73, Y => 3.14);

52 Altípusok n A subtype mechanizmussal altípusok definiálhatók n A típusértékhalmaz csökkenthető n Csak futási idejű ellenőrzésekhez n A fordító számára ugyanaz a típus n Öröklődés és altípusképzés?

53 Altípusos polimorfizmus n Osztályszintű típusok: 'Class attribútum n T’Class: a T jelölt típus és leszármazottai n Úniózza azok típusértékhalmazát n Implicit konverzió: Pont konvertálódik Alakzat’Class-ra n Nem teljesen definiált típus X: Alakzat’Class := Pont’(Piros, 3.14, 2.73); n Alakzat’Class altípusa Pont’Class

54 Heterogén szerkezetek X: array (1..3) of Alakzat := ( (Színe=>Piros), (Színe=>Fehér), (Színe=>Zöld) ); type Alakzatok_Access is access Alakzat’Class; Y: array (1..3) of Alakzatok_Access := ( new Pont'(Piros, 3.14, 2.73), new Alakzat'(Színe=>Fehér), new Alakzat'(Színe=>Zöld) ); csak Alakzatok akár Pontok is

55 Statikus és dinamikus típus X: Alakzat’Class := Bekér; n statikus: Alakzat’Class n dinamikus: Alakzat / Pont n nem változhat a dinamikus típus function Bekér return Alakzat’Class is P: Pont; begin Get( P.Színe ); if End_Of_Line then return Alakzat(P); else Get( P.X ); Get( P.Y ); return P; end if; end Bekér;

56 Dinamikus kötés n Felüldefiniálás esetén n A dinamikus típus szerinti kód hajtódik végre n A kötés végrehajtási időben n Szemben a statikus kötéssel (fordító) n Kisebb hatékonyság, nagyobb rugalmasság n Lehetőségek: – Java: mindig dinamikus – C++: a művelet definiálásakor jelzem (virtual) – Ada: a híváskor jelzem

57 Primitív művelet felüldefiniálása (1) package Alakzatok is type Alakzat is tagged record Színe: Szín; end record; function Image ( A: Alakzat ) return String; type Pont is new Alakzat with record X, Y: Float; end record; function Image ( P: Pont ) return String; end Alakzatok;

58 Primitív művelet felüldefiniálása (2) package body Alakzatok is function Image ( A: Alakzat ) return String is begin return Szín’Image(A.Színe); end Image; function Image ( P: Pont ) return String is begin return Image(Alakzat(P)) & ‘ ‘ & Float’Image(P.X) & ‘ ‘ & Float’Image(P.Y); end Image; end Alakzatok;

59 Dinamikus kötés híváskor A: Alakzat := (Színe => Piros); P: Pont := (Piros, 3.14, 2.73); X: Alakzat’Class := Bekér; Y: Alakzatok_Access := new Pont’(Fehér, 2.73, 3.14); … Put_Line( Image(A) );-- statikus kötés Put_Line( Image(P) );-- statikus kötés Put_Line( Image(X) );-- dinamikus kötés Put_Line( Image(Y.all) );-- dinamikus kötés

60 Ugyanaz a művelet stat./din. kötéssel procedure Put_Statikus ( A: in Alakzat ) is begin Put( Image(A) ); end Put_Statikus; procedure Put_Dinamikus ( A: in Alakzat ) is begin Put( Image(Alakzat’Class(A)) ); end Put_Dinamikus;

61 Újrakiválasztás (1) package Alakzatok is type Alakzat is tagged record Színe: Szín; end record; function Image ( A: Alakzat ) return String; procedure Put ( A: in Alakzat ); type Pont is new Alakzat with record X, Y: Float; end record; function Image ( P: Pont ) return String; end Alakzatok;

62 Újrakiválasztás (2) package body Alakzatok is function Image ( A: Alakzat ) return String is begin return Szín’Image(A.Színe); end Image; procedure Put ( A: in Alakzat ) is begin Put( Image(Alakzat’Class(A)) ); end Put; function Image ( P: Pont ) return String is begin return Image(Alakzat(P)) & ‘ ‘ & Float’Image(P.X) & ‘ ‘ & Float’Image(P.Y); end Image; end Alakzatok;

63 Egyenlőség osztályszintű típusokra X, Y: Alakzat’Class := Bekér; … if X.all = Y.all then … end if; n Ha különbözik a dinamikus típus, akkor False (nem Constraint_Error)

64 Dinamikus típusellenőrzés n Egy értéket tartalmaz-e egy típus n Mint a subtype-oknál X: Alakzat’Class := Bekér; X in Pont’Class-- típustartalmazás X in Pont-- típusegyezés

65 Absztrakt típus n Nem használható objektum létrehozására n Absztrakt (megvalósítás nélküli) műveletet tartalmazhat n Típusspecifikáció vagy részleges implementáció n Absztrakció: a leszármazottak közös őse type Alakzat is abstract tagged record Színe: Szín; end record; function Image ( A: Alakzat ) return String; procedure Kirajzol ( A: in Alakzat ) is abstract;

66 Többszörös öröklődés n Különböző vélemények – nincs (Simula, Smalltalk, Ruby, VB, Beta, Oberon...) – teljes támogatás (CLOS, C++, Eiffel …) – típusspecifikációra (Objective-C, Object Pascal, Java, C#...) n Egyáltalán nincs az Adában n Helyette más lehetőségek (mixin) – egyszeres öröklődés + sablon – access diszkrimináns