J
Ę
ZYK SYMULACYJNY MODSIM
programowanie zorientowane
obiektowo
Metody symulacyjne
1
obiektowo
Zagadnienia
• Definicja i własności obiektów.
• Deklaracja i definicja typu obiektowego.
• Instancja obiektu a typ obiektowy.
2
• Instancja obiektu a typ obiektowy.
• Pola i metody.
• Dziedziczenie.
• Prototypowanie obiektów.
Obiekt
w języku MODSIM jest dynamicznie
powoływaną i usuwaną strukturą danych ściśle
powiązaną z pewnymi operacjami zwanymi tu
metodami.
Definicja i własności obiektu.
3
metodami.
•hermetyzacja (ang. encapsulation)
•dziedziczenie
Własności:
Definicja i własności obiektu cd.
4
•dziedziczenie
•polimorfizm
•przesyłanie komunikatów
•hierarchizacja typów
Deklaracja i definicja typu obiektowego (klasy).
• Na definicję klasy składają się dwa bloki
programowe:
– blok deklaracji składowych klasy i opcjonalnie listy
dziedziczenia
– blok definicji metod klasy (wszystkich zadeklarowanych
5
Syntaktyka bloku deklaracji typu
– blok definicji metod klasy (wszystkich zadeklarowanych
wyżej)
Deklaracja i definicja typu obiektowego (klasy).
6
Przykład deklaracji typu obiektowego.
TYPE
LiczbaZespolonaObj = OBJECT
czescRzeczyw
: REAL;
czescUrojona
: REAL;
Deklaracja i definicja typu obiektowego (klasy).
7
ASK METHOD ustawWartosc(IN r, i : REAL);
ASK METHOD dodaj(IN a, b : complexNbrObj);
END OBJECT;
VAR x, y, z : LiczbaZespolonaObj;
Deklaracja i definicja typu obiektowego (klasy).
8
Przykład bloku definicji obiektu.
OBJECT LiczbaZespolonaObj;
ASK METHOD ustawWartosc(IN r, i : REAL);
BEGIN
czescRzeczyw := r;
czescUrojona := i;
END METHOD;
Deklaracja i definicja typu obiektowego (klasy).
9
END METHOD;
ASK METHOD dodaj(IN a, b : LiczbaZespolonaObj);
BEGIN
{kod dodawania}
END METHOD;
END OBJECT;
FORWARD
– stanowi „zapowied
ź
” pełnej definicji typu lub procedury w
dalszej cz
ęś
ci modułu umo
ż
liwiaj
ą
c wcze
ś
niejsze wykorzystanie
zapowiadanego elementu przy definicji innego
PROCEDURE Proc1(IN a, b : REAL; OUT c : REAL); FORWARD;
CarObj = OBJECT; FORWARD;
...
Kwalifikator FORWARD
Deklaracja i definicja typu obiektowego (klasy).
10
...
PROCEDURE Proc1(IN a, b : REAL; OUT c : REAL);
BEGIN
... {kod procedury}
END PROCEDURE;
CarObj=OBJECT;
...
END OBJECT;
Różnice między metodami a procedurami
• Metoda jest przywi
ą
zana do obiektu i mo
ż
e by
ć
wywołana
jedynie poprzez wysłanie komunikatu do tego obiektu z
żą
daniem wykonania okre
ś
lonej metody.
• W przeciwie
ń
stwie do procedur, mo
ż
e istnie
ć
wiele metod o
Pola i metody.
11
• W przeciwie
ń
stwie do procedur, mo
ż
e istnie
ć
wiele metod o
tej samej nazwie, przy czym ka
ż
da z nich mo
ż
e mie
ć
ró
ż
ny
kod (działanie) oraz list
ę
parametrów.
• Niektóre metody (i tylko metody) mog
ą
powodowa
ć
upływ
czas symulacyjnego (TELL i WAITFOR).
Pola i metody cd.
• Metody typu
ASK
• Metody typu
TELL
• Metody typu
WAITFOR
Rodzaje metod:
12
• Metody typu
WAITFOR
ASK
- działanie natychmiastowe, podobne do działania
procedury lub funkcji - nie wytraca czasu symulacji
Deklaracja:
Pola i metody cd.
Rodzaje metod:
13
ASK METHOD nazwaMetody [(lista parametrów formalnych)]
ASK METHOD PodajStan(INOUT stan: REAL);
Wywołanie:
ASK obiekt [TO] nazwaMetody [(lista parametrów aktualnych)]
ASK kasa TO PodajStan(aktualnyStan);
Pola i metody cd.
Rodzaje metod:
TELL
- związana jest z upływem czasu symulacji. W jednej
chwili może być wykonywane kilka metod TELL
Deklaracja:
14
TELL METHOD nazwaMetody [(lista parametrów formalnych)];
TELL METHOD Obsluga(IN czas: REAL);
Wywołanie:
TELL obiekt [TO] nazwaMetody [(lista parametrów aktualnych)]
[IN opó
ź
nienie]
TELL kasa TO Obsluga(5.0) IN 10.0;
Pola i metody cd.
Rodzaje metod:
WAITFOR
- związana jest z upływem czasu symulacji. W
jednej chwili może być wykonywane kilka metod WAITFOR
Deklaracja:
WAITFOR METHOD nazwaMetody [(lista parametrów formalnych)];
WAITFOR METHOD Obsluga(IN czas: REAL;OUT ile: INTEGER);
15
WAITFOR METHOD Obsluga(IN czas: REAL;OUT ile: INTEGER);
Wywołanie (tylko wewnątrz instrukcji upływu czasu
WAIT FOR
):
WAIT FOR obiekt [TO] nazwaMetody [(listaParametrów
Aktualnych)];
END WAITFOR;
WAIT FOR kasa TO Obsluga(5.0, ileKlientow)
END WAIT;
Powoływanie instancji obiektu: ObjInit
Typ obiektu a instancja obiektu.
Niektóre typy obiektów wymagaj
ą
inicjalizacji.
TYPE
movingObj = OBJECT
x, y : REAL;
16
x, y : REAL;
ASK METHOD ObjInit;
ASK METHOD Stop;
END OBJECT;
Je
ś
li obiekt posiada zdefiniowan
ą
metod
ę
ObjInit, wtedy jest ona
automatycznie wywoływana przez procedur
ę
NEW.
Usuwanie instancji obiektu: ObjTerminate
Typ obiektu a instancja obiektu cd.
ObjTerminate jest wykorzystywana do wykonania czynno
ś
ci przed
usuni
ę
ciem samego obiektu.
TYPE
movingObj = OBJECT
x, y : REAL;
17
x, y : REAL;
ASK METHOD ObjInit;
ASK METHOD ObjTerminate;
ASK METHOD Stop;
END OBJECT;
Metoda jest wywoływana automatycznie przez procedur
ę
DISPOSE zanim obiekt zostanie usuni
ę
ty z pami
ę
ci.
Klonowanie obiektów: ObjClone
Do tworzenia kopii instancji obiektu słu
ż
y funkcja
CLONE. W wyniku jej wywołania nast
ę
puje:
• Alokacja pami
ę
ci dla nowej instancji obiektu
• Przepisanie warto
ś
ci pól obiektu klonowanego do
Typ obiektu a instancja obiektu cd.
18
• Przepisanie warto
ś
ci pól obiektu klonowanego do
nowego obiektu
• Wywołanie metody ObjInit dla nowej instancji
• Wywołanie metody ObjClone dla nowej instancji
Przykład klonowania obiektu
Typ obiektu a instancja obiektu cd.
VAR movingObj1, movingObj2 : MovingObj;
BEGIN
NEW(movingObj1);
...
19
...
movingObj2 := CLONE(movingObj1);
DISPOSE(movingObj1);
DISPOSE(movingObj2);
END MODULE;
Zgodność typów obiektów
• Typ1 i Typ2 s
ą
tym samym typem obiektowym
• Typ pochodny w hierarchii dziedziczenia jest zgodny dla
typów b
ę
d
ą
cych jego przodkami
Typ obiektu a instancja obiektu cd.
20
typów b
ę
d
ą
cych jego przodkami
• Typ ANYOBJ jest typem zgodnym ze wszystkimi typami
obiektowymi i na odwrót
Typ obiektowy: ANYOBJ
Typ obiektu a instancja obiektu cd.
PROCEDURE switchObjects(INOUT firstObj : ANYOBJ;
INOUT secondObj : ANYOBJ);
VAR temp : ANYOBJ;
BEGIN
21
BEGIN
temp := firstObj;
firstObj := secondObj;
secondObj := temp;
END PROCEDURE;
Stała referencyjna: SELF
Typ obiektu a instancja obiektu cd.
Jest ona wykorzystywana:
przy odwoływaniu si
ę
obiektu do własnych pól i metod
(czytelno
ść
kodu)
TELL
SELF
TO move(IN x : REAL; IN y : REAL);
22
przy identyfikacji obiektu przez inny obiekt:
ASK METHOD airTrafficController;
BEGIN
distance := ASK movingObj TO reportDistance(
SELF
);
END METHOD;
Pola i metody cd.
Do pól obiektu mo
ż
na odwoływa
ć
si
ę
na trzy sposoby:
• speedValue :=
ASK
movingObject [
TO
] speed;
• speedValue := movingObject
.
speed;
Odwoływanie się do pól obiektu
23
• speedValue := movingObject
.
speed;
• speedValue := speed;
Pola i metody cd.
Wywołanie metody nast
ę
puje poprzez wysłanie do obiektu
komunikatu
np.:
ASK
someObject [
TO
]
Wywoływanie metod obiektu
24
ASK
someObject [
TO
]
doSomething[(lista parametrów)];
Dziedziczenie.
25
Istota dziedziczenia pojedynczego.
Dziedziczenie cd.
26
Istota dziedziczenia wielokrotnego.
Prototypowanie obiektów.
BObj = OBJECT;
...
END OBJECT;
ListaAObj = PROTO;
field : #BObj;
ASK METHOD doSomething(IN a : #BObj) : #BObj;
END PROTO;
27
END PROTO;
DObj = OBJECT(BObj);
...
END OBJECT;
ListaCObj = OBJECT(ListaAObj[BObj : DObj]);
...
END OBJECT;
Uwaga: DObj musi by
ć
typem pochodnym od BObj.