V predchádzajúcom článku sme si povedali o štruktúre písania tried v ActionScript 2.0. V tomto si povieme o jednotlivých bodoch štruktúry viac. Ako definovať správne triedu, cestu k triede, ako deklarovať triedu, jej metódy a vlastnosti…

Definovanie súboru triedy v AS2.0

Pri písaní tried v novom ActionScripte treba dodržiavať určité pravidlá. V AS1.0 ste mohli napísať viacero tried do jedného externého .as súboru alebo priamo do .fla súboru. V AS2.0 môžu byť triedy uložené len v externých .as súboroch. V jednom .as súbore môže byť definovaná vždy iba jedna trieda. Každý externý .as súbor musí byť uložený pod menom rovnakým s názvom triedy v ňom definovanej. Napríklad ak máme triedu s názvom MojaTrieda, musí byť definovaná v externom .as súbore s názvom MojaTrieda.as. Pozor na veľké a malé písmená.

S novým systémom definovania tried je ukladanie, spravovanie, hľadanie a šírenie tried oveľa rýchlejšie a efektívnejšie. Takto definované triedy môžete ďalej využívať znova a znova v ďalších projektoch, môžete ich ďalej distribuovať, namiesto toho, aby ste vždy programovali to isté odznova pri každom novom projekte.

Macromedia už využila tento princíp pri programovaní tried a komponentov, ktoré využívate pri práci vo Flashi. Takto vytvorené sú všetky triedy v adresári „en/First Run/Classes/“, ktorý nájdete v adresári vašej inštalácie Flash MX 2004.

Práca s balíkmi tried

Triedy môžu byť usporiadané v balíkoch tried. Ide vlastne o spôsob organizácie tried. Ak používame balíky tried, musí byť splnené dve veci. Trieda musí pri jej deklarovaní špecifikovať balík, v ktorom sa nachádza, a zároveň musí byť uložená v korešpondujúcom adresáry. Napríklad ak by sme mali triedu v balíku „mojBalikTried.pracovneTriedy“, tak .as súbor musí byť uložený v adresári „mojBalikTried/pracovneTriedy“.

Balíky tried sa hlavne využívajú pri väčších projektoch, pri ktorých sa píše veľa tried. Ak robíte projekt s 5 triedami, asi nebude mať pre vás význam ich dávať do adresárov a deklarovať ich ako triedy v balíku. Ale ak máte tried 50, už to začína mať zmysel. Ďalšia situácia, z ktorej vám balíky pomôžu vykľučkovať, je rovnaké pomenovanie tried. Ak sú dve triedy s rovnakým menom, Flash nevie, ktorú triedu má vlastne použiť. Riešením by bolo pomenovať každú triedu jedinečným menom, ale ak si stiahnete z internetu už hotové triedy, nemáte zaručené, že ich mená sa nebudú zhodovať s vašimi menami tried. Samozrejme, je tam pravdepodobnosť, že stiahnuté triedy budú aj v rovnakom balíku, ale tá je oveľa menšia.

Definovanie cesty k triede

Ak používate triedy a viete, že triedy musia byť v externých .as súboroch, musíte povedať Flashu, kde má tieto externé súbory hľadať. Vo flashi sú prednastavené dve cesty k triedam. Flash najskôr prezrie adresár „en/First Run/Classes“ a ak tam nenájde vami použitú triedu, hľadá v adresári, v ktorom je uložený Flash alebo ActionScript dokument (.fla alebo .as súbor). Ak nenájde ani tam, hľadá na miestach, ktoré ste vy špecifikovali ako ďalšie cesty k triedam.

Ak chcete zadať novú cestu pre triedy, použite menu „Edit/Preferences“, kliknite na záložku „ActionScript“ a v spodnej časti okna je tlačítko „ActionScript 2.0 Settings“.

Pridanie vlastnej cesty k triedam
Obrázok 1: Pridanie vlastnej cesty k triedam

Zobrazí sa vám okno s už spomínanými dvoma preddefinovanými cestami. V „$(LocalData)/Classes“ je cesta k triedam „en/First Run/Classes“ a „.“ znamená adresár, v ktorom je uložený Flash alebo ActionScript dokument. Ako vidíte, pridal som si vlastnú cestu k adresáru „c:\mojeTriedy“ pomocou tlačítka „+“. Pomocou šípok hore a dole môžete nastaviť prioritu vyhľadávania tried.

Deklarácia triedy

Deklarácia triedy sa zjednodušene dá zhrnúť v štyroch bodoch:

  • deklarácia pomocou kľúčového slova class a mena triedy
  • deklarácia vlastností triedy
  • deklarácia funkcie konštruktoru
  • deklarácia metód triedy

Deklarácia triedy pomocou class keyword

Trieda v AS2.0 sa deklaruje pomocou kľúčového slova „class“, za ktorým nasleduje meno triedy a svorkové zátvorky, medzi ktorými je definícia triedy.

class MojaTrieda
{
// sem príde definícia triedy
}

Ak chcete deklarovať triedu v balíku tried, musíte do mena triedy doplniť názov balíku. Napríklad ak chcete, aby „mojaTrieda“ bola v balíku „mojBalikTried.pracovneTriedy“, deklarácia by bola následovná:

class mojBalikTried.pracovneTriedy.MojaTrieda
{
// sem príde definícia triedy
}

Samozrejme trieda „MojaTrieda.as“ musí byť uložená v adresári „mojBalikTried/pracovneTriedy“, ktorý musí byť v jednom z adresárov, ktoré sme definovali ako cesty k triedam. Napríklad ak máme zadefinovanú cestu k triedam ako „c:\mojeTriedy“, potom by ste mohli uložiť triedu „MojaTrieda“ ako „c:\mojeTriedy\mojBalikTried\pracovneTriedy\MojaTrieda.as“.

Deklarácia vlastností triedy

Vlastnosti triedy musia byť deklarované vo vnútri svorkových zátvoriek pri definovaní triedy. Všetky vlastnosti triedy musia byť deklarované mimo deklarovaných metód triedy. Obyčajne sa vlastnosti deklarujú na začiatku definície triedy.

class mojBalikTried.pracovneTriedy.MojaTrieda
{
private var mojaVlastnost:String;
// zvyšok definície triedy
}

Slovíčko „private“ je vysvetlené ďalej v článku. Komu nie je jasný syntax striktného definovania vlastností, odporúčam prečítať predchádzajúce články série.

Deklarácia funkcie konštruktoru

Konštruktor je špeciálna metóda triedy, ktorá zdieľa rovnaké meno ako trieda. Konštruktor sa využíva na vytvorenie inštancie triedy. Ak v budúcnosti budete chcieť vytvoriť inštanciu triedy, využijete na to príkaz new a konštruktor triedy.

Ak v definícii triedy nedeklarujete funkciu konštruktoru, Flash si vytvorí prázdny konštruktor za vás. Konštruktor sa vytvára ako normálna funkcia. Môže akceptovať parametre, ale nemal by vracať žiadne hodnoty.

class mojBalikTried.pracovneTriedy.MojaTrieda
{
private var mojaVlastnost:String;
// constructor
function MojaTrieda ()
{
}
// zvyšok definície triedy
}

Deklarácia metód triedy

Metódy sa deklarujú ako normálne funkcie, s rovnakým syntaxom, použitím príkazu function. Metódy sú funkcie priradené k triede. Keď definujete funkciu v rámci triedy, Flash ju automaticky priradí k triede. Jediný rozdiel medzi funkciami a metódami je, že metódy môžu byť deklarované ako verejné, súkromné a statické, na rozdiel od funkcií.

class mojBalikTried.pracovneTriedy.MojaTrieda
{
// deklarovanie vlastností triedy
private var mojaVlastnost:String;
// constructor
function MojaTrieda ()
{
}
// deklarovanie metód triedy
public function verejnaMetoda (premenna:String):Void
{
trace (premenna)
}
private function sukromnaMetoda (premenna:String):Void
{
// pridelenie hodnoty premennej sukromnej vlastnosti triedy mojaVlastnost=premenna;
}
// zvyšok definície triedy
}

Súkromné a verejné členy tried

Trieda sa skladá z jej členov. Členmi triedy sú metódy a vlastnosti. V AS1.0 boli všetky členy verejné. Členy triedy v AS2.0 môžu byť súkromné, verejné a statické.

Verejný člen, čiže metóda alebo vlastnosť, je dostupná z inštancie triedy. Pri deklarovaní verejného člena sa používa kľúčové slovo public. Ak sa pri deklarovaní člena nepoužije žiadne kľúčové slovo, je taktiež považovaný za verejný.

public var verejnaVlastnost:String;

Pri deklarovaní súkromného člena nechceme, aby tento člen bol prístupný verejne, a tak použijeme kľúčové slovo private pred deklaráciou člena. Súkromné členy sú prístupné len v rámci triedy.

private var sukromnaMetoda () {}

Private sa správa viac menej ako protected v iných programovacích jazykoch. Táto ochrana proti neželanému prístupu k súkromným členom je len taká polovičná. Dá sa obísť viacerými spôsobmi, pretože deklarovanie členov sa kontroluje len pri kompilácii (compile-time feature). Ak zavoláme súkromnú metódu triedy, pri kompilovaní sa vygeneruje chyba…

MojaTrieda.sukromnaMetoda(); // vygeneruje chybu pretože metóda je súkromná

…ale ak zavoláme metódu dynamicky, žiadna chyba sa nevygeneruje:

MojaTrieda[„sukromnaMetoda“](); // nevygeneruje chybu

Statické členy tried

Statické členy sú prístupné priamo z triedy a nie z jej inštancie. Príklad triedy so statickými členmi je trieda Math. Ak používame triedu Math, nevytvárame si jej inštanciu pomocou príkazu „new“ a jej konštruktoru, ale voláme jej statické metódy priamo z nej, napríklad:

trace(Math.max(10,20));

Metóda max je statická metóda a tak sa volá priamo z triedy. Statické členy môžeme ďalej deklarovať ako verejné alebo súkromné. Napríklad deklarácia súkromnej statickej vlastnosti:

private static var statickaVlastnost:String;

Getter a setter metódy

Getter a setter metódy sú špeciálne metódy, ku ktorým pristupujeme mimo triedu ako k vlastnostiam triedy a vo vnútri triedy sú deklarované ako metódy. Výhody týchto metód:

  • Navonok vystupujú ako vlastnosti triedy, ale v skutočnosti tieto metódy deklarované vo vnútri triedy môžu obsahovať komplikovanú logiku.
  • Dovoľujú nám pracovať s programátorskými názvami premenných (ako „rodCis“), ale navonok sprístupniť tieto premenné v užívateľsky prístupnejšej forme ako „rodneCislo“.
  • Dovoľujú nám vytvoriť vlastnosti len na čítanie alebo vlastnosti len na zapisovanie.
  • Dovoľujú nám vytvoriť virtuálne premenné, ktoré vzniknú napríklad spojením viacerých premenných v rámci triedy.

Getter a setter metódy môžeme ďalej deklarovať ako verejné alebo statické, avšak nemôžu byť deklarované ako súkromné.

Getter metóda by nemala akceptovať žiadne parametre a mala by vždy vracať hodnotu. Getter metóda používa kľúčové slovo get. Príklad verejnej getter metódy, ktorá vracia hodnotu vlastnosti „rodCis“:

public function get rodneCislo ():Number
{
return rodCis;
}

Setter metóda by mala vždy akceptovať parametre a nemala by nikdy vracať hodnotu. Setter metóda používa kľúčové slovo set. Príklad verejnej setter metódy, ktorá zadáva hodnotu vlastnosti „rodCis“:

public function set rodneCislo(cislo:Number):Void
{
rodCis=cislo;
}

Ak by sme chceli zakomponovať ďalšiu logiku, čo nám getter a setter metódy umožňujú, mohli by sme skontrolovať či užívateľ zadal správny počet čísiel:

public function set rodneCislo(cislo:Number):Void
{
if(cislo.toString().length==10)
{
rodCis=cislo;
}
else
{
rodCis=undefined;
}
}

Dynamické triedy

Trieda v AS2.0 môže byť dynamická. Pozor, trieda buď je dynamická alebo nie je dynamická. Ak by sa na prvý pohľad zdalo, že protiklad k dynamickej je statická trieda, nie je tomu tak. Statické môžu byť len členy triedy a nie samotná trieda. Pri deklarovaní dynamickej triedy použijeme kľúčové slovo dynamic, v opačnom prípade toto kľúčové slovo vynecháme.

dynamic class DynamickaTrieda
{
// definícia triedy
}

Ak je trieda dynamická, znamená to, že vlastnosti a metódy môžu byť do triedy pridávané za behu aplikácie, bez nutnosti ich predchádzajúceho deklarovania v danej triede. Tak isto to znamená, že iná trieda alebo .fla súbor môže pristupovať k metódam a vlastnostiam triedy, ktoré neexistujú bez vygenerovania chyby pri kompilácii. Príklad dynamickej triedy:

dynamic class DynamickaTrieda
{
public function mojaMetoda(Void):Void
{
trace(„toto je moja metóda);
}
}

Potom v súbore .fla môžeme zadať hodnotu ešte nedeklarovanej vlastnosti triedy:

var trieda:DynamickaTrieda=new DynamickaTrieda();
trieda.novaPremenna=true; // nevygeneruje žiadnu chybu pri kompilácii

Hello World v ActionScript 2.0

A nakoniec si napíšeme veľmi jednoduchú, notoricky známu nevyhnutnosť pri učení sa programovacieho jazyka, triedu „HelloWorld“. Len pre ukážku ako sa dopracovať už k samotnému použitiu triedy vo .fla súbore.

Začneme s písaním triedy v externom .as súbore. Otvorme si nový ActionScript file vo Flash MX 2004 a zadeklarujeme si triedu HelloWorld:

class HelloWorld
{
// zadeklarujeme si jedinú verejnú metódu našej triedy
public function sayHello()
{
trace(„Ahoj svet!“);
}
}

Uložte tento ActionScript súbor ako „HelloWorld.as“. Vytvorte nový .fla súbor a uložte ho pod ľubovolným menom ale do toho istého adresára, ako ste uložili „HelloWorld.as“. Kliknite na prvú frame a do „Actions Panel“ napíšte:

MyHelloWorld=new HelloWorld(); // použitie constructoru
MyHelloWorld.sayHello();

Po otestovaní by ste mali vidieť v Output okne správu „Ahoj svet!“.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Žádný příspěvek v diskuzi

Odpovědět