1
JĘZYK SYMULACYJNY MODSIM
programowanie zorientowane
obiektowo
Metody symulacyjne
2
Zagadnienia
• Definicja i własności obiektów.
• Deklaracja i definicja typu obiektu.
• Instancja obiektu a typ obiektowy.
• Pola i metody.
• Dziedziczenie.
• Prototypowanie obiektów.
3
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.
4
•hermetyzacja (ang. encapsulation)
•dziedziczenie
•polimorfizm
•przesyłanie komunikatów
•hierarchizacja typów
Własności:
Definicja i własności obiektu
cd.
5
Deklaracja i definicja typu obiektowego
(klasy).
Syntaktyka bloku deklaracji typu
• Na definicję klasy składają się dwa bloki
programowe:
– blok deklaracji składowych klasy i
opcjonalnie listy dziedziczenia
– blok definicji metod klasy (wszystkich
zadeklarowanych wyżej)
6
Deklaracja i definicja typu obiektowego
(klasy).
7
Przykład deklaracji typu obiektowego.
TYPE
LiczbaZespolonaObj = OBJECT
czescRzeczyw : REAL;
czescUrojona : REAL;
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
Deklaracja i definicja typu obiektowego
(klasy).
9
Przykład bloku definicji
obiektu.
OBJECT LiczbaZespolonaObj;
ASK METHOD ustawWartosc(IN r, i : REAL);
BEGIN
czescRzeczyw := r;
czescUrojona := i;
END METHOD;
ASK METHOD dodaj(IN a, b : LiczbaZespolonaObj);
BEGIN
{kod dodawania}
END METHOD;
END OBJECT;
Deklaracja i definicja typu obiektowego
(klasy).
10
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;
...
PROCEDURE Proc1(IN a, b : REAL; OUT c : REAL);
BEGIN
... {kod procedury}
END PROCEDURE;
CarObj=OBJECT;
...
END OBJECT;
Kwalifikator FORWARD
Deklaracja i definicja typu obiektowego
(klasy).
11
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 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.
12
Pola i metody cd.
• Metody typu
ASK
• Metody typu
TELL
• Metody typu
WAITFOR
Rodzaje metod:
13
ASK
- działanie natychmiastowe, podobne do
działania procedury lub funkcji - nie wytraca czasu
symulacji
Deklaracja:
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:
14
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:
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;
15
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);
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;
16
Powoływanie instancji obiektu:
ObjInit
Typ obiektu a instancja
obiektu.
Niektóre typy obiektów wymagają inicjalizacji.
TYPE
movingObj = OBJECT
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.
17
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;
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.
18
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
nowego obiektu
• Wywołanie metody ObjInit dla nowej instancji
• Wywołanie metody ObjClone dla nowej instancji
Typ obiektu a instancja obiektu
cd.
19
Przykład klonowania
obiektu
Typ obiektu a instancja obiektu
cd.
VAR movingObj1, movingObj2 : MovingObj;
BEGIN
NEW(movingObj1);
...
movingObj2 := CLONE(movingObj1);
DISPOSE(movingObj1);
DISPOSE(movingObj2);
END MODULE;
20
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 ANYOBJ jest typem zgodnym ze wszystkimi
typami obiektowymi i na odwrót
Typ obiektu a instancja obiektu
cd.
21
Typ obiektowy: ANYOBJ
Typ obiektu a instancja obiektu
cd.
PROCEDURE switchObjects(INOUT firstObj : ANYOBJ;
INOUT secondObj : ANYOBJ);
VAR temp : ANYOBJ;
BEGIN
temp := firstObj;
firstObj := secondObj;
secondObj := temp;
END PROCEDURE;
22
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);
przy identyfikacji obiektu przez inny obiekt:
ASK METHOD airTrafficController;
BEGIN
distance := ASK movingObj TO
reportDistance(
SELF
);
END METHOD;
23
Pola i metody cd.
Do pól obiektu można odwoływać się na trzy sposoby:
• speedValue :=
ASK
movingObject [
TO
] speed;
• speedValue := movingObject
.
speed;
• speedValue := speed;
Odwoływanie się do pól
obiektu
24
Pola i metody cd.
Wywołanie metody następuje poprzez wysłanie do obiektu
komunikatu
np.:
ASK
someObject [
TO
]
doSomething[(lista parametrów)];
Wywoływanie metod
obiektu
25
Istota dziedziczenia pojedynczego.
Dziedziczenie.
26
Dziedziczenie cd.
Istota dziedziczenia wielokrotnego.
27
Prototypowanie obiektów.
BObj = OBJECT;
...
END OBJECT;
ListaAObj = PROTO;
field : #BObj;
ASK METHOD doSomething(IN a : #BObj) : #BObj;
END PROTO;
DObj = OBJECT(BObj);
...
END OBJECT;
ListaCObj = OBJECT(ListaAObj[BObj : DObj]);
...
END OBJECT;
Uwaga: DObj musi być typem pochodnym od BObj.