Typy prywatne 1
1.
Typy prywatne
W Adzie
typy prywatne
(
private types
) służą do
bezpiecznego udostępniania danych
zdefiniowanych w pakiecie, z którego korzysta
klient tego pakietu.
Typy prywatne opisują stopień widzialności
danych pomiędzy pakietem i klientem pakietu.
W przypadku typu prywatnego program kliencki
dysponuje zdefiniowaną wstępnie
instrukcją
podstawienia
:= i zdefiniowaną wstępnie
relacją nierówności
/=, która zanegowana
jest równoważna
relacji równości
=.
Typy prywatne 2
Przykład 1.
Wektory_2D
Część pakietu do słowa kluczowego
private
jest udostępniona programowi klienckiemu. W
tej części zadeklarowano typ Wektor_2d i stałą
Zero tego typu, przy czym deklaracje te są
niepełne
.
Typ poza nazwą nie ma opisu, a stała nie ma
nadanej wartości.
Te szczegóły implementacyjne określone są w
części prywatnej
i dzięki temu
są
niewidoczne
w programie klienckim.
W części prywatnej podana jest pełna
deklaracja typu Wektor_2d oraz oparte na niej
wartościowanie stałej Zero.
Typy prywatne 3
Tego rodzaju stałą nazywamy
stałą odłożoną
(
deferred constant
).
Klient pakietu Wektory_2D może używać danych
typu Wektor_2D mając zdefiniowane wstępnie
instrukcję podstawienia i relację równości. Poza
tym, klient może korzystać z operacji dodawania
"+" wektorów i mnożenia "*" wektora przez
liczby rzeczywiste.
Pakiet udostępnia też operacje wejścia/wyjścia w
postaci procedur
Czytaj_Wektor_2D i Wypisz_Wektor_2D
Pierwsza z nich jest konstruktorem danych typu
Wektor_2D, natomiast nie zdefiniowano w
pakiecie selektora oraz zapytań.
Typy prywatne 4
W programie klienckim pakietu udostępniającego
typ prywatny można deklarować stałe i zmienne
tego typu w zwykły sposób, ale
nie można
zmiennym
nadawać wartości początkowych
odwołując się szczegółów implementacyjnych typu
prywatnego.
Następująca deklaracja
jest błędna
:
A : Wektor_2D := (1 => 1.0, 2 => 2.0);
a
poprawna
jest deklaracja
A : Wektor_2D := Zero;
Obiekty zadeklarowane w części prywatnej pakietu
definicyjnego
są dostępne
w części
implementacyjnej.
Przykładem jest stała Zero z pakietu Wektory_2D.
Typy prywatne 5
W pakiecie można wyróżnić trzy logicznie części:
1.
Część widoczną
(
visible part
) dla klienta
pakietu określającą logiczny interfejs między
klientem, a pakietem
2.
Część prywatną
(
private part
), która określa
szczegóły implementacji tego interfejsu
3.
Część implementacyjną
(
implementation
part
), szczegóły implementacyjne obiektów
udostępnianych przez część widoczną.
W części widocznej
nie można
definiować
zmiennych i alokować pamięci dla danych typu
prywatnego,
można
natomiast deklarować stałe
odłożone, inne typy, podtypy i nagłówki
podprogramów z parametrami typu prywatnego.
Typy prywatne 6
Zadanie 1.
Napisać funkcje Pierwsza_Skladowa
i Druga_Skladowa obliczające odpowiednio
pierwszą i drugą składową wektora typu
Wektor_2D. Założyć przy tym, że pełna
deklaracja tego typu ma postać
type
Wektor_2D
is record
Pierwsza_Wsp : Float;
Druga_Wsp : Float;
end record
;
Zadanie 2.
Napisać funkcję Konstruktor_2d
konstruującą daną typu Wektor_2D
zdefiniowanego wyżej.
Wykorzystać zasoby pakietu Odporne_Wejscie.
Typy prywatne 7
Zadanie 3.
Przyjmując definicję typu
Wektor_2D jak w zadaniu 1, napisać funkcje
"+", "*", "*" służące odpowiednio do:
obliczania sumy dwóch wektorów i
obliczania iloczynu wektora przez skalar
rzeczywisty.
Zadanie 4.
Przyjmując definicję typu
Wektor_2D jak w zadaniu 1, napisać pełne
deklaracje stałych Wersor_Pierwszy i
Wersor_Drugi, które reprezentują
odpowiednio wektory:
1
(1,0)
=
e
2
(0,1)
=
e
Typy prywatne 8
2. Typy prywatne ograniczone