next up previous contents index
Next: Metody Up: Typy a hodnoty Previous: Typy a hodnoty   Obsah   Index


Definice atributů

Objekty mohou mít atributy, kterými jsou provázány s ostatními. Atributy, které mají mít všechny objekty třídy, nazýváme atributy instancí a musejí být deklarovány ve třídě. Definice atributu instance má v Plutu následující tvar:

[public|private][instance] $a \Rightarrow \tau$ [default $\nu$];

kde $a$ je atribut, $\tau$ je typ a $\nu$ je hodnota. Toto specifikuje, že $a$ je atribut třídy $\tau$ definovaný tak, že pokud tento atribut konkrétního objektu nenabývá žádných hodnot, je použita implicitní hodnota $\nu$ daná definicí.

Předpokládejme následující příklad:

class osoba [rok_narozeni $\Rightarrow$ integer(1900..2000) default 1970; druh $\Rightarrow$ osoba;
pohlavi $\Rightarrow$ char({'M','F'}) default 'F'; rodice $\Rightarrow$ {osoba}]

Takto deklarujeme atributy rok_narozeni, pohlavi, druh a rodice třídy osoba jako základní datové typy integer(1900..2000), char({'M','F'}), sebe sama a typ množina {osoba} a pokud nejsou zadány hodnoty pro atributy rok_narozeni pohlavi jsou použity počáteční hodnoty.

Pokud jsou bob a pam jména dvou instancí třídy osoba, pak bob.rok_narozeni $\rightarrow$ 1960 a pam.druh $\rightarrow$ bob specifikují, že objekt určený názvem bob má hodnotu atributu rok_narození 1960 a dále objekt určený názvem pam má hodnotu atributu druh naplněnou ukazatelem na objekt určený názvem bob. Tyto hodnoty jsou v rámci předchozí deklarace typu osoba zadány správně. Ale nesmí existovat zároveň bob.rok_narozeni $\rightarrow$ 1960 a bob.rok_narozeni $\rightarrow$ 1950. Jinak řečeno, hodnoty atributů musejí být unikátní. Připouští se také možnost, že hodnoty atributů některých objektů není nutné zadat. Atributy instance mohou mít pouze instance třídy.

Na hodnoty atributů instancí se můžeme dotázat následujícím způsobem:

?-pam.druh $\rightarrow$ S, S.rok_narozeni $\rightarrow$ B.

Pluto také podporuje tradiční tečkovou notaci. Formálně zapsané $o.a_1.a_2..a_n \rightarrow X$ znamená $o.a_1 \rightarrow X_1,
X_1.a_2 \rightarrow X_2, ..., X_{n-1}.a_n \rightarrow X$. Původní dotaz na hodnotu atributu instance může tedy vypadat v Plutu i takto:

?-pam.druh.rok_narozeni $\rightarrow$ B.

Má-li třída několik atributů stejného typu: $a_1 \Rightarrow \tau,
...,a_n \Rightarrow \tau$ můžeme toto deklaraci spojit do $a_1,
..., a_n \Rightarrow \tau$. Následuje příklad:

class bod[x,y $\Rightarrow$ real]

Jednou ze základních vlastností OO přístupu je skrývání informací. To znamená, že můžeme omezit přístup k hodnotám atributů. V Plutu se používá modifikátor private k označení, že k definovanému atributu není možný přímý přístup, zatímco jeho vynechání nebo použití slova public značí že k atributu můžeme přistoupit přímo zvenku.

Předpokládejme následující příklad:

class zamestanec [jmeno $\Rightarrow$ string; private plat $\rightarrow$ integer]

Pro instanci třídy je atribut jmeno přímo dosažitelné, zatímco atribut plat nikoliv. K privátním atributům můžeme nepřímo přistupovat také pomocí metod, což bude vysvětleno později.

V Plutu mají i třídy své atributy. Kvantifikátorem static stejně jako v Javě nebo v C++ označujeme, že definovaný atribut je atributem třídy. Je-li tento vynechán je definovaný atribut pouze atributem instance. Atribut třídy pak v Plutu definujeme:

[public|private] static $a \Rightarrow \tau$ [default $\nu$];

kde $a$ je jméno atributu třídy a $\tau$ je typ. Tato deklarace říká, že $a$ je atributem třídy $\tau$.

Předpokládejme následující příklad:

class osoba [jmeno $\Rightarrow$ string; vek $\Rightarrow$ integer;
static soucet $\Rightarrow$ integer default 0;
static tento_rok $\Rightarrow$ integer default 2000]

kde první dva atributy jsou atributy instancí a zbývající dva jsou atributy třídy. V Plutu se používají atributy tříd pro reprezentaci konstant důležitých pro třídu jako např.: tento_rok. Každá instance třídy má své vlastní atributy instance, zatímco atributy třídy jsou atributy konkrétní definované třídy a jsou dostupné pro instance této třídy. Stejně jako atributy instancí můžeme pomocí modifikátorů public a private ovlivnit dostupnost k atributům tříd.

Implicitně je nastaven public, pokud však nastavíme private znemožníme tím přímý přístup k danému atributu.

Pro přímý přístup k public atributům tříd můžeme využít přímo třídu. Sestavíme např. takovýto dotaz:

?- osoba.soucet $\rightarrow$ X.

?- osoba.tento_rok $\rightarrow$ X.

Přímo přistoupit k atributům tříd můžeme také pomocí jednotlivých instancí tříd. Např. je-li bob objekt (instance) třídy osoba, pak mají následující dotazy stejný výsledek jako ty předchozí:

?-bob.soucet $\rightarrow$ X.

?-bob.tento_rok $\rightarrow$ X.


next up previous contents index
Next: Metody Up: Typy a hodnoty Previous: Typy a hodnoty   Obsah   Index
Tomáš Kubíček 2002-05-19