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

Hasonló dokumentumok
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).

Helyes-e az alábbi kódrészlet? int i = 1; i = i * 3 + 1; int j; j = i + 1; Nem. Igen. Hányféleképpen lehet Javaban megjegyzést írni?

Programozási technikák Pál László. Sapientia EMTE, Csíkszereda, 2009/2010

Programozási nyelvek Java

5. előadás Parametrikus polimorfizmus. Generikus programozás. Az Ada sablonok.

JAVA PROGRAMOZÁS 2.ELŐADÁS

Java programozási nyelv 5. rész Osztályok III.

Az UPPAAL egyes modellezési lehetőségeinek összefoglalása. Majzik István BME Méréstechnika és Információs Rendszerek Tanszék

Programozási nyelvek (ADA)

Programozási nyelvek Java

Változók élettartama

PROGRAMOZÁSI NYELVEK - ADA. GYAKORLAT JEGYZET

OOP: Java 8.Gy: Abstract osztályok, interfészek

A szemantikus elemzés helye. A szemantikus elemzés feladatai. A szemantikus elemzés feladatai. Deklarációk és láthatósági szabályok

Programozási nyelvek Java

15. Programok fordítása és végrehajtása

Objektumorientált programozás C# nyelven

és az instanceof operátor

... S n. A párhuzamos programszerkezet két vagy több folyamatot tartalmaz, melyek egymással közös változó segítségével kommunikálnak.

Bánsághi Anna 2014 Bánsághi Anna 1 of 33

Java VIII. Az interfacei. és az instanceof operátor. Az interfészről általában. Interfészek JAVA-ban. Krizsán Zoltán

Java programozási nyelv 4. rész Osztályok II.

Széchenyi István Egyetem. Programozás III. Varjasi Norbert

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.

Már megismert fogalmak áttekintése

Programozás módszertan p.1/46

Programozási nyelvek a közoktatásban alapfogalmak II. előadás

JAVA PROGRAMOZÁS 3.ELŐADÁS

Objektumelvű programozás

List<String> l1 = new ArrayList<String>(); List<Object> l2 = l1; // error

Interfészek. PPT 2007/2008 tavasz.

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

Programozási nyelvek II. JAVA EA+GY 1. gyakolat

Magas szintű programozási nyelvek 2 Előadás jegyzet

Java VI. Miskolci Egyetem Általános Informatikai Tanszék. Utolsó módosítás: Ficsor Lajos. Java VI.: Öröklődés JAVA6 / 1

OBJEKTUM ORIENTÁLT PROGRAMOZÁS JAVA NYELVEN. vizsgatételek

Java és web programozás

Objektumelvű alkalmazások fejlesztése 6. gyakorlat. Öröklődés, polimorfizmus. Öröklődés Kódismétlődés objektum-orientált szerkezetben

Programozás II. 3. gyakorlat Objektum Orientáltság C++-ban

CSOMAG. Az Ada csomag két részből áll: csomag specifikáció csomag törzs. -- specifikációs rész: PACKAGE név IS. -- a csomag kívülről nem látható része

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

11) Statikus és dinamikus hatóköri szabályok. Statikus és dinamikus hatókör. értelmezzük

Programozás II. 2. gyakorlat Áttérés C-ről C++-ra

Programozási nyelvek I. (Az Ada) Kozsik Tamás

OOP. Alapelvek Elek Tibor

3. előadás Típusrendszerek. Az Ada típusai és típuskonstrukciós eszközei, I.

Bevezetés a Programozásba II 8. előadás. Polimorfizmus Giachetta Roberto

Algoritmizálás és adatmodellezés tanítása 1. előadás

Informatika terméktervezőknek

Programozás II. 2. Dr. Iványi Péter

Pelda öröklődésre: import java.io.*; import java.text.*; import java.util.*; import extra.*;

C# osztályok. Krizsán Zoltán

2. előadás Programegység, fordítási egység, könyvtári egység, beágyazás, blokkszerkezet, alprogramok, csomagok

Kifejezések. Kozsik Tamás. December 11, 2016

Felhasználó által definiált adattípus

OOP #14 (referencia-elv)

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.

C# nyelv alapjai. Krizsán Zoltán 1. Objektumorientált programozás C# alapokon tananyag. Általános Informatikai Tanszék Miskolci Egyetem

Alkalmazott Modul III 6. előadás. Objektumorientált programozás: öröklődés és polimorfizmus

Web-technológia PHP-vel

A modell-ellenőrzés gyakorlata UPPAAL

Kivételkezelés, beágyazott osztályok. Nyolcadik gyakorlat

Adatbázis Rendszerek II. 5. PLSQL Csomagok 16/1B IT MAN

Programozás II. ATM példa Dr. Iványi Péter

C++ programozási nyelv

C# Nyelvi Elemei. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) C# Nyelvi Elemei / 18

Miután létrehoztuk, szeretnénk neki beszédesebb nevet adni. A név változtatásához a következőt kell tenni:

Programozás I. Első ZH segédlet

Bánsághi Anna

Java VII. Polimorfizmus a Java nyelvben

Java VII. Polimorfizmus a Java nyelvben

1. Mi a fejállományok szerepe C és C++ nyelvben és hogyan használjuk őket? 2. Milyen alapvető változókat használhatunk a C és C++ nyelvben?

Algoritmizálás. Horváth Gyula Szegedi Tudományegyetem Természettudományi és Informatikai Kar

A Java és a C++ összehasonlítása

Kilencedik témakör: Lazarus-Firebird. Készítette: Dr. Kotsis Domokos

Concurrency in Swing

Programozási nyelvek Java

Programozás. C++ osztályok. Fodor Attila. Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek Tanszék

Rendezések. A föltöltés nemcsak az r-re vonatkozik, hanem az s-re is. Ez használható föl a további rendezések

C++ programozási nyelv Konstruktorok-destruktorok

Osztályok. 4. gyakorlat

C# Szálkezelés. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) C# Szálkezelés / 21

Virtuális függvények (late binding)

OOP és UML Áttekintés

B IT MAN 65/1. Adatbázis Rendszerek II. Ellenőrző kérdések APLSQL B IT MAN. v:

Bevezetés a programozásba Előadás: Objektumszintű és osztályszintű elemek, hibakezelés

Java VI. Egy kis kitérő: az UML. Osztály diagram. Általános Informatikai Tanszék Utolsó módosítás:

WEBFEJLESZTÉS 2. ADATBÁZIS-KEZELÉS, OSZTÁLYOK

OOP #1 (Bevezetés) v :39:00. Eszterházy Károly Főiskola Információtechnológia tsz. Hernyák Zoltán adj.

Kommunikáció. Távoli eljáráshívás. RPC kommunikáció menete DCE RPC (1) RPC - paraméterátadás. 3. előadás Protokollok. 2. rész

Programozási nyelvek (ADA)

Az osztályok csomagokba vannak rendezve, minden csomag tetszőleges. Könyvtárhierarhiát fed: Pl.: java/util/scanner.java

Visual C++ osztály készítése, adattagok, és metódusok, láthatóság, konstruktor, destruktor. Objektum létrehozása, használata, öröklés.

Objektum orientált programozás Bevezetés

OAF Gregorics Tibor: Minta dokumentáció a 3. házi feladathoz 1.

BABEŞ BOLYAI TUDOMÁNYEGYETEM MATEMATIKA ÉS INFORMATIKA KAR BBTE Matek-Infó verseny 1. tételsor INFORMATIKA írásbeli. A versenyzők figyelmébe:

Absztrakció. Objektum orientált programozás Bevezetés. Általános Informatikai Tanszék Utolsó módosítás:

Átírás:

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

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

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

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; 4

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); 5

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; 6

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; or delay Véletlen_Idő; Villák(Bal).Letesz; end select; end loop; end Éhes_Vagyok; 7

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

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

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

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); 11

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; or terminate; end select; end loop; end Véletlen; task Véletlen is entry Random ( F: out Float ); end Véletlen; 12

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 ); 13

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

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

Kiéheztetés Livelock, starvation Nincs holtpont (deadlock) Fut a rendszer De: egy folyamat mindig rosszul jár Nem képes elvégezni a feladatát 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 Példa: ügyetlen író-olvasó megvalósításnál Az olvasók könnyen kiéheztethetik az írókat 16

Í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; Szemafor-szerű 17

Í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 ; 18

Í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; 19

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

Í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; or when (not Writing) and then (Nr_Of_Readers = 0) => accept Start_Writing; Writing := True; or accept Stop_Reading; Nr_Of_Readers := Nr_Of_Readers - 1; or accept Stop_Writing; Writing := False; or terminate; end select; az olvasók éhezhetnek 21

Író-olvasó: Ada taszk segítségével (6) 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 Ebben nincs kiéheztetés Bizonyos olvasó folyamatokat nem engedek olvasni, amikor pedig épp olvasási szakasz van 22

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

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 a védett adat function Olvas return Adat is begin return X; end; procedure Ír( A: in Adat ) is begin X := A; end; end Erőforrás; 24

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

Védett egység és monitor task Monitor is entry M1 (... ); entry M2 (... ); 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 (... ); procedure M2 (... ); end Monitor; protected body Monitor is procedure M1 (... ) is end; procedure M2 (... ) is end; end Monitor; Monitor.M1( ); Monitor.M2( ); 26

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

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; 28

Védett objektum és védett típus Mint a taszk és a taszk típus 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 29

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

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; 31

Taszkok versus védett egységek Monitor taszk helyett védett egység: tömörebb, kényelmesebb 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 Író-olvasó is triviális 32

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

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

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

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

A requeue utasítás Egy entry törzsében használható 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 A másik entry: vagy paraméter nélküli vagy ugyanazokkal a paraméterekkel 37

Ü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; 38

Ü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; 39

Belépésipont-családok Belépési pontokból álló tömb 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! ); 40

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ő; Hívás: Kijelző.Üzenet(Magas)("Nemsokára ZH!"); 41

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ő; 42

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; 43

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

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

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

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

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

Jelölt (tagged) rekordok Származtatásnál újabb mezőkkel bővíthető 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; 49

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

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); 51

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

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

Heterogén szerkezetek X: array (1..3) of Alakzat := ( (Színe=>Piros), (Színe=>Fehér), (Színe=>Zöld) ); csak Alakzatok akár Pontok is 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) ); 54

Statikus és dinamikus típus X: Alakzat Class := Bekér; statikus: Alakzat Class dinamikus: Alakzat / Pont 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; 55

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

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; 57

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; 58

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 59

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; 60

Ú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; 61

Ú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; 62

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

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

Absztrakt típus Nem használható objektum létrehozására Absztrakt (megvalósítás nélküli) műveletet tartalmazhat Típusspecifikáció vagy részleges implementáció 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; 65

Többszörös öröklődés 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#...) Egyáltalán nincs az Adában Helyette más lehetőségek (mixin) egyszeres öröklődés + sablon access diszkrimináns 66