Seriál o výuce objektově orientovaného programování pokračuje kapitolami 2.8 Definice atributů a 2.9 Definujeme vlastní metodu.
2.8 Definice atributů
Kdybychom zůstali u dosavadní podoby definice konstruktorů, tak bychom toho s našimi smrčky moc dělat nemohli. Jednotlivé trojúhelníky se sice nakreslí, ale pak již s nimi nic dalšího dělat nemůžeme (vynechávám prohlížení instancí). Abychom tyto pomocné trojúhelníky mohli ještě někdy o něco požádat (např. o to, aby se přesunuly), musíme si někde zapamatovat odkaz na ně. Potřebujeme proto definovat atributy instancí, do nichž budeme potřebné informace ukládat.Atributy definujeme skoro stejně jako parametry. Neuvádějí se však v žádné hlavičce, ale v těle třídy vně těl jejích metod. Aby se nám kód lépe četl, umísťují se definice atributů v těle třídy většinou před definice metod tak, jak to napovídá komentář ve zdrojovém souboru.
I v definici atributu musíme uvést nejprve typ atributu a pak jeho identifikátor (název). Oproti definici parametru máme navíc ještě dvě možnosti:
- před typ atributu můžeme vložit modifikátory, které blíže specifikují některé vlastnosti definovaného atributu;
- dokážeme-li určit počáteční hodnotu atributu (tj. nepotřebujeme-li k jejímu zjištění nějaké parametry zadávané až při volání konstruktoru), můžeme za název atributu přidat rovnítko a za ním počáteční hodnotu zadat.
Celou definici atributu ukončíme středníkem. Syntaktickou definici definice atributu bychom mohli zapsat následovně:
Definice atributu: [ modifikátor ]… typ název [ = počáteční_hodnota ] ;Prozatím jsem se setkávali pouze s modifikátorem public, který oznamoval, že příslušnou třídu či metodu mohou používat všichni. Atributy jsou však považovány za soukromou věc každé třídy, ve které nemá nikdo cizí mít šanci se hrabat. Které atributy je třída ochotna zveřejnit, k těm poskytne příslušné přístupové metody. Ostatní jsou její soukromou záležitostí.
Vše, co chceme deklarovat jako soukromou věc třídy, označujeme modifikátorem private. Dohodněme se, že všechny atributy budeme označovat vždy jako private. Jedinou výjimkou mohou být konstanty, protože ty nemá stejně nikdo šanci nijak změnit.
Vynechám-li kvůli úspoře místa dokumentační komentáře (v programu je však nevynechávejte), mohla by definice třídy Smrk s potřebnými atributy a třemi výše popsanými konstruktory vypadat např. takto:
public class Smrk { //== ATRIBUTY INSTANCI ========================================================= private Trojuhelnik horni; private Trojuhelnik stredni; private Trojuhelnik dolni; //== KONSTRUKTORY ============================================================== public Smrk( int x, int y, int sirka, int vyska ) { horni = new Trojuhelnik( x+sirka/5, y, 3*sirka/5, 3*vyska/7 ); stredni=new Trojuhelnik( x+sirka/10, y+vyska/7, 4*sirka/5, 4*vyska/7 ); dolni = new Trojuhelnik( x, y+2*vyska/7, sirka, 5*vyska/7 ); }//public Smrk( int x, int y, int sirka, int vyska ) public Smrk( int x, int y ) { this( x, y, 50, 70 ); }//public Smrk( int x, int y ) public Smrk() { this( 0, 0, 50, 70 ); }//public Smrk() }//public class SmrkNyní třídu přeložte a nechte zkonstruovat jednu její instanci. Když v místní nabídce této instance zadáte příkaz Prohlížet, otevře se známé prohlížecí okno a v něm se opravu objeví ony tři atributy, které jsme ve třídě definovali. Jak vidíte, dokonce se o nich dozvíme, že jsou soukromé (private) a že jsou instancemi typu Trojuhelnik.
Protože jsou tyto atributy instancemi objektového typu, neukáže se nám žádná hodnota, jak jsme tomu byli zvyklí u celých čísel, ale prohlížeč nám pouze oznámí, že obsahem atributu je odkaz na objekt. My se však můžeme na tento objekt podívat zblízka. Jakmile totiž klepnete na některý z objektových atributů, „obživne“ vpravo tlačítko Prohlížet a po stisknutí tohoto tlačítka se otevře okno prohlížeče, které nám umožní do útrob daného atributu nahlédnout.
Úkol 1:
Otevřete prohlížecí okna pro všechny trojúhelníky, z nichž je stromek sestaven, a ověřte, že hodnoty jejich atributů odpovídají tomu, co jsme zadávali v konstruktoru.
Úkol 2:
Definujte atributy i pro svoje třídy Snehulak, Domek a Panak a upravte příslušně i konstruktory. Nechte pak vytvořit instance těchto tříd a prohlédněte si jejich atributy.
Možné důsledky zveřejnění atributů
Jak jsem řekl, všechny atributy by měly být deklarovány jako soukromé. Ukažme si, co by se mohlo stát, kdyby tomu tak nebylo. Změňte např. deklaraci horního trojúhelníka a označte jej jako veřejný. Třídu znovu přeložte, vytvořte její instanci a podívejte se na ni prohlížečem. Klepněte nyní na horní trojúhelník. Vpravo se rozsvítí nejenom tlačítko Prohlížet, ale také tlačítko Získat odkaz.Stiskněte toto tlačítko a v zásobníku odkazů se objeví nový odkaz nazvaný horni. Nyní otevřete místní nabídku tohoto odkazu a zadejte např. příkaz posunVpravo(). Vrchní část stromku, na jejíž instanci odkaz vede, se poslušně přesune požadovaným směrem. Můžete ji samozřejmě zadat jakýkoliv jiný příkaz (např. smaž) a ona poslechne.
Předpokládám, že možné důsledky zveřejnění atributů jsou z tohoto příkladu jasné. Protože je atribut veřejný, může k němu přistupovat kdokoliv. Je úplně jedno, zda nevhodnou manipulací s atributem poškodí vaši instanci záměrně nebo omylem – důsledkem bude poškozená instance.
Rudolf Pecinovský
0 comments:
Post a Comment