Rudolf Pecinovský: Učíme objektově orientované programování (3) – Třídy a instance v praxi

čtvrtek 12. prosince 2002 ·

Třetím dílem, který je věnovaný třídám a instancím, pokračuje seriál o výuce objektově orientovaného programování (OOP). Stejně jako v předchozích částech i zde naleznete vyčerpávající popis a několik názorných sejmutých obrazovek.

Vytváříme svou první instanci

V jazyku Java (a dalších současných objektově orientovaných jazycích – C++, C#, VisualBasic.NET) vytváříme instance tříd pomocí operátoru new, za nímž uvedeme název třídy a dvojici kulatých závorek. Tím zavoláme speciální funkci, které říkáme konstruktor a která danou instanci vytvoří. My pak obdržíme na tuto instanci odkaz, prostřednictvím nějž se na ni budeme obracet.

Poznámka:
V moderních programovacích jazycích náš program nikdy neobdrží instanci, kterou vytvořil. Obdrží pouze odkaz na tuto instanci. Vlastní instance je zřízena někde na haldě (heap – oblast paměti vyhrazená právě pro ukládání vytvořených instancí), kterou má na starosti správce paměti (garbage collector – doslova popelář). Ten se stará o to, aby instance, které již nikdo nepotřebuje, nezabíraly v paměti zbytečně místo. Některé studie tvrdí, že toto řešení zvyšuje produktivitu programátorské práce oproti práci v klasickém C++ minimálně dvojnásobně.

Vyzkoušíme si vše v praxi. V našem projektu máme pouhé 4 třídy: třídu Platno, jejíž instance představuje kreslicí plátno, a třídy Obdelnik, TrojuhelnikElipsa, jejichž instance představují objekty, které lze na toto plátno nakreslit. Vyjmenované třídy jsou zobrazeny jako rozdělené obdélníky (jak jsem říkal, BlueJ zakresluje třídy podle pravidel jazyka UML).

Zkusme vytvořit např. instanci obdélníku. Klepněte pravým tlačítkem na třídu Obdelnik. Rozbalí se místní nabídka, v jejíž horní části je seznam konstruktorů. Klepněte na první z uvedených konstruktorů, tj. ten bezparametrický (za názvem třídy má prázdné závorky).

Otevře se dialogové okno (viz obr. 2), v němž vás BlueJ seznámí se základními údaji o vyvolávaném konstruktoru a zároveň se vás zeptá na název odkazu na vytvářený objekt. Tento název musí splňovat pravidla pro vytváření identifikátorů v jazyce Java (kdo to ještě neví, tak mu prozradím, že v programovacích jazycích se nehovoří o názvech, ale o identifikátorech):

  • smí obsahovat pouze písmena, číslice a znaky „_“ (podtržítko) a „$“ (dolar);
  • nesmí začínat číslicí;
  • jejich délka není omezena (to u řady jiných programovacích jazyků neplatí)

Poznámka:
Teoreticky podle definice jazyka patří mezi písmena všechny znaky včetně českých, ruských či japonských, nicméně řada prostředí (a BlueJ je prozatím bohužel mezi nimi) se s neanglickými znaky nekamarádí, takže je prozatím v našich programech nebudu používat.

My můžeme prozatím akceptovat název, který nám program nabídne. Po potvrzení názvu se vytvoří instance třídy Obdelnik a odkaz na ni se umístí do zásobníku odkazů.

Položky v zásobníku odkazů můžeme považovat za proměnné, v nichž jsou uloženy příslušné odkazy. Název proměnné je uveden v prvním řádku červeného zaobleného obdélníku, název třídy, na jejíž instanci odkaz ukazuje, pak v řádku druhém.

Konstruktor při vytváření instance zároveň zařídí, aby se na plátně zobrazil příslušný obrázek, a pokud ještě plátno neexistuje, tak aby se vytvořilo (tj. požádá třídu Platno, aby vytvořila svoji instanci), protože jinak by nebylo na co kreslit. Dalším výsledkem tedy je, že se otevře okno plátna a na něm bude zobrazen náš obdélník.

Poznámka 1:
Pokud okno plátna nevidíte, bude asi schované pod nějakým jiným oknem – dost možná právě pod oknem BlueJ. Zobrazíte je buď tak, že na panelu úloh klepnete na jeho tlačítko, anebo že budete postupně minimalizovat či posouvat otevřená okna, až okno plátna najdete.

Poznámka 2:
Třída Platno je zrovna třídou, která vám nedovolí vytvořit její instanci prostřednictvím konstruktoru (tj. pomocí operátoru new), protože trvá na tom, aby její instance byla jedináček. Proto se musíme spolehnout na to, že se s ní třídy Obdelnik, ElipsaTrojuhelnik dokáží dohodnout, aby vše fungovalo tak, jak to fungovat má.


Posíláme instanci zprávu

Nyní zkusíme nově vytvořenému obdélníku poslat nějakou zprávu. Klepněte pravým tlačítkem myši na červený zaoblený obdélník s odkazem. Rozbalí se poměrně dlouhá místní nabídka, která má nahoře černé položky zastupující zprávy (vysvětlení, proč vypadají právě takto, si necháme na později) a dole červené položky zastupující příkazy pro vývojové prostředí. Zadejte příkaz void posunVpravo() – a ejhle, obdélník se po plátně opravdu posune vpravo.

Vytváříme další instance

Říkali jsme si, že běžná třída může mít více instancí. Tak si to hned vyzkoušíme a vytvoříme další obdélník – požádejte  třídu Obdelnik stejným způsobem o druhý obdélník. Potvrďte opět nabízený název a zkontrolujte, že se v zásobníku odkazů objevil příslušný odkaz a že se v levém horním rohu plátna opravdu vytvořil druhý obdélník.

Úkol: Vytvořte instance dalších tříd. Pošlete jednotlivým instancím zprávy void posunVpravo(), void posunVlevo(), void posunNahoru() a void posunDolu() a ověřte si, že na každou zprávu reaguje ten objekt, kterému jste ji poslali.


Parametry a jejich typy

Zkusíme si vytvořit ještě další instanci třídy Obdelnik. Abychom se však neopakovali, použijeme nyní některý z dalších konstruktorů. Ty již mají v závorkách za názvem třídy, jejíž instanci vytvářejí, uveden seznam parametrů, které musíme při jejich volání zadat.

V místní nabídce (viz obr. 1) je každý parametr zastoupen svým názvem, jenž naznačuje, jaký údaj konstruktor v daném místě očekává. Abych s ním však mohl následně pracovat, potřebuje, aby byl zadaný údaj správného typu.

Typ údaje popisuje, co je daný údaj zač. Svůj typ mají nejenom parametry, ale veškerá data, se kterými program pracuje. Java (a naprostá většina ostatních moderních jazyků) trvá na tom, aby byl u každého údaje předem znám jeho typ. Za to se nám odmění tím, že odhalí řadu našich chyb již v zárodku.

V nejbližších kapitolách se budeme setkávat se třemi typy:

  • int označuje typ celých čísel, která se mohou pohybovat přibližně v rozsahu od ‑2 000 000 000 do +2 000 000 000;
  • String definuje typ znakových řetězců; aby je program správně rozpoznal, musíte je vždy zadávat uzavřené mezi uvozovkami – např. „Znakový Řetězec“;
  • boolean definuje typ logických hodnot, které mohou nabývat pouze hodnot true (pravda, ano, …) a false (nepravda, ne, …)

Vyvolání konstruktoru s parametry

Zkusme tedy zavolat 5parametrový konstruktor. Po zadání příslušného povelu se objeví velké dialogové okno (viz obr. 5), v němž nás BlueJ žádá nejenom o zadání (nebo alespoň potvrzení) názvu odkazu na vytvářený objekt, ale také o hodnoty jednotlivých parametrů.

Horní část okna zobrazuje popis funkce volaného konstruktoru spolu s popisem významu jednotlivých parametrů. Neděste se toho, že popis je trochu kryptický (zašifrovaný) – je to opsaná část programu sloužící k tvorbě dokumentace. Pamatujte si, že za každým @param následuje název parametru a jeho popis.

Poznámka:
V této části nemusí být vždy uvedeny všechny parametry. Jsou tam jen ty, které se tvůrce programu rozhodl popsat. Berte proto tento návod pouze jako pomůcku a smiřte se s tím, že programy tvůrců, kteří jsou líní dělat dokumentaci, je nabízet nebudou.

Tučný text nad vodorovnou dělící čarou budeme označovat jako hlavička konstruktoru. V hlavičce je uveden seznam všech parametrů (tentokrát opravdu všech), přičemž u každého parametru je uveden nejprve jeho typ a za typem jeho název. Typ i název každého parametru je pak zopakován u vstupního pole, do nějž budete zadávat hodnotu tohoto parametru.

Dejme tomu, že budeme opět akceptovat nabízený název odkazu a že náš třetí obdélník bude fialový, 25 bodů široký, 50 bodů vysoký a bude umístěn na souřadnicích [100;100].


Posílání zpráv s paramety

Konstruktory jsou pouze zvláštním druhem zpráv. Obdobně jako při volání konstruktorů zadáváme parametry i při posílání obyčejných zpráv. Dejme tomu, že bychom se rozhodli barevně odlišit druhý obdélník od prvního. Jednou z možností je zaslat druhému obdélníku zprávu, v níž jej požádáme, aby se přebarvil dejme tomu na černo. Otevřete proto jeho místní nabídku a zadejte v ní příkaz void setBarva(String).

Terminologická poznámka:
Zasílání zpráv se v programech v Javě realizuje prostřednictvím volání speciálních funkcí označovaných jako metody. Názvy metod pro nastavování nějakých charakteristik objektů začínají v Javě podle konvence slůvkem set, názvy metod pro zjišťování těchto charakteristik začínají slůvkem get a v případě, kdy se má vrátit informace typu ANO/NE, slůvkem is. Protože s těmito konvencemi některé nástroje počítají, budu je používat hned z počátku, abyste si na ně zvykli a nemuseli se něco přeučovat v okamžiku, kdy budete potřebovat použít nástroje, které používání těchto konvencí vyžadují. Za výše popsanými „předponami“ pak budu používat první pád, tj. např. setBarva a ne setBarvu.

Poznámka k prostředí:
U konstruktorů jsme si říkali, že BlueJ uvádí v nabídce názvy jednotlivých parametrů. Jak jste si možná všimli, v místní nabídce instancí uvádí naopak jejich typy. Na můj dotaz autoři uvedli, že to je historický důsledek nějakých starších rozhodnutí a slíbili, že to v příští verzi odstraní.

Podoba příkazu napovídá, že metoda setBarva(String) vyžaduje předání parametru, kterým je informace o požadované barvě. Tuto informaci přitom metoda bude chtít zadat ve formě textového řetězce. Po zadání příkazu proto BlueJ otevře dialogové okno, v němž nás o zadání parametru požádá, a zároveň vypíše informace o tom, jak má požadovaný parametr vypadat. Uposlechněte a zadejte textový řetězec s požadovanou barvou.

Obrázek 7:  Volání metody s parametrem

Terminologická poznámka:
Vedle hlavičky konstruktoru existuje i hlavička metody, ve které jsou uvedeny všechny základní informace potřebné pro její volání. Tuto hlavičku vypisuje BlueJ v dialogovém okně Volání metody nad vodorovnou dělící čáru.

Poznámka:
Možná jste si v místních nabídkách všimli, že některé metody mají stejný název a liší se pouze počtem a/nebo typem parametrů. (Programovací jazyky neumožňují definovat dvě různé metody se stejným názvem a seznamem typů parametrů.) Aby proto bylo vždy jasné, o které metodě (zprávě) hovořím, budu se snažit název metody vždy doplňovat závorkami se seznamem typů jejích parametrů.

Úkol: Zkuste nyní vytvořit i instance dalších tříd (trojúhelníků a elips) a vyzkoušejte si, jak budou reagovat na zprávy, které jim budete posílat. Zkuste pomocí příkazů vytvořit nějaký zajímavý obrázek.

Poznámka:
Smaže-li některý obrazec během přesunu část jiného obrazce, můžete narušený obrazec obnovit zasláním zprávy nakresli().



Rudolf Pecinovský

0 komentářů:

Články dle data



Učitelské listy

Nabídka práce

Česká škola - portál pro ZŠ a SŠ

Česká škola poskytuje svým čtenářům diskusní prostor k vyjádření názorů na školskou problematiku. Tyto příspěvky se nemusí shodovat se stanoviskem redakce České školy a jsou uveřejňovány jako podnět k dalším diskusím.

Obsah článků nemusí vyjadřovat stanovisko redakce nebo vydavatele Albatros Media, a.s.


Všechna práva vyhrazena.

Tento server dodržuje právní předpisy
o ochraně osobních údajů.

ISSN 1213-6018




Licence Creative Commons

Obsah podléhá licenci Creative Commons Uveďte autora-Neužívejte dílo komerčně-Nezasahujte do díla 3.0 Česká republika, pokud není uvedeno jinak nebo nejde-li o tiskové zprávy.



WebArchiv - archiv českého webu



Tyto webové stránky používají k poskytování služeb, personalizaci reklam a analýze návštěvnosti soubory cookie. Informace o tom, jak tyto webové stránky používáte, jsou sdíleny se společností Google. Používáním těchto webových stránek souhlasíte s použitím souborů cookie.