Vlastní třídy
Obsah
- Jmenná konvence
- Základní definice třídy
- Viditelnost prvků objektu
- Statické prvky objektu
- Přístupové metody vlastností (gettery a settery)
- Typové omezení vstupních a výstupních dat
- Rozšíření třídy (extends)
- Implementace rozhraní (implements)
- Rozhraní (interface)
- Dynamická třída (dynamic)
- Vestavěná třída (intrinsic)
Jmenná konvence
Třídy se vždy ukládají do souborů s koncovkou .as. Jejich název a umístění má stanovena přísná pravidla. To proto, aby pak třídu mohl kompiler najít a použít.
Název třídy je shodný s názvem souboru.
Pokud tedy mám třídu
motion, musí být uložena v souborumotion.as.Soubor musí být uložen na stejném místě jako obsluhující FLA.
Kde všude má také kompiler třídy hledat lze ovšem nastavit v Publish Settings.

Třída může být i součástí balíčku
Například třída
common.utils.motionpak bude uložena v souboru./common/utils/motion.asV animaci ji pak voláte celým jménem, tedy
common.utils.motion()Ve verzi 3.0 už název balíčku není součástí jména třídy, definuje se přehledněji blokem
package.Doporučuje se používat unikátní názvy balíčků. U větších projektů předejdete jmenným kolizím.
Jeden z doporučených způsobů je použít (obráceně) jméno domény, kde bude flash umístěn.
Napříkladcz.jakpsatweb.flash.motionMezi cílovou doménou a názvy tříd ale samozřejmě není žádná vazba - je to jen konvence.
Obsah balíčku je také možné importovat. Pak už nemusíte psát celý název a postačí jen
motion. Hvězdičkou vložite všechny položky dané úrovně.import common.utils.* var pohyb:motion = new motion();
Základní definice třídy
class motion { var speed = 25; // vlastnosti var ease = 0.5; var direction = 'CCW'; function motion(){ // konstruktor } function rotate(){ // metoda rotate } }
V animaci bychom pak mohli psát například:
var pohyb = new motion(); pohyb.rotate(); trace(pohyb.speed); // 25
Zde je myslím zatím vše jasné. Jen upozornění ohledně konstruktoru (tj. metody, která je volána při vytvoření instance) - jeho název musí být shodný s názvem třídy, ovšem už bez názvů balíčků.
Viditelnost prvků objektu
Stejně jako po otevření kapoty auta už dneska můžete tak akorát dolít vodu do ostřikovačů, zbytek výrobce schovává pod plastovým krytem, i u prvků třídy můžete určit, které vlastnosti a metody mohou být dostupné z vnějšku a které ne.
class motion { public var speed = 25; public var ease = 0.5; private var direction = 'CCW'; public function motion(){ // konstruktor } public function rotate(){ // metoda rotate } }
Veřejný prvek (
public)Dostupný odkudkoliv (výchozí hodnota).
Privátní prvek (
Dostupný jen zevnitř třídy, případně z potomků třídy.private)Moment, nemělo tu být
protectedmístoprivate?Mělo. Je to pakárna AS2.0, který vlastně nemá skutečný
privatemód (tj. neviditelný ani z potomků třídy). V AS3.0 už je to tak, jak má být.
Pozor na viditelnost konstruktoru. Měl by být public, pokud chcete vytvářet přímé instance třídy. Může být private, pokud chcete třídu použít jen jako základ extenzí.
Statické prvky objektu
Jak jsem zmiňoval v úvodu do objektů, statická vlastnost nebo metoda se vztahuje k prototypu nikoliv k instanci.
public static var speed = 25;
Přístupové metody vlastností (gettery a settery)
Vlastnost je možné upravovat a číst stejně jako proměnnou. U objektů je ale pro vlastnost možné nastavit přístupovou metodu (accessor), která může předanou (nebo čtenou) hodnotu upravit (nebo vzít úplně odjinud).
class motion { private var _speed = 25; public function set speed(value){ if(value > 0){ this._speed = value; }else{ this._speed = 0; } } public function get speed(){ return this._speed; } }
Vidíte, že settery a gettery se označují klíčovými slovy get a set, název samotné funkce je pak stejný, jako název vlastnosti, kterou zastupuje. Setter má jeden argument (nastavovanou hodnotu).
V našem případě setter kontroluje, jestli je hodnota kladná:
var pohyb = new motion(); pohyb.speed = -90; trace(pohyb.speed); // 0
Typové omezení vstupních a výstupních dat
Stejně jako u funkcí a proměnných, i v návrhu vlastností a metod třídy je možné omezit typ dat.
class motion { public var speed:Number = 25; public var ease:Number = 0.5; private var direction:String = 'CCW'; public function motion(){ // konstruktor } public function rotate():Void{ // metoda rotate } }
Konstruktor (logicky) nemůže vracet hodnoty, nemůže mít tedy ani omezen výstupní datový typ.
Vytvořením třídy vytváříte také datový typ
ActionScript je objektový jazyk, všechny datové typy jsou vlastně objekty. Při vytváření instance vlastního prototypu můžeme také omezit datový typ:
var pohyb:motion = new motion();
Rozšíření třídy (extends)
Při vytváření vlastní třídy můžete jako základ použít už nějakou existující.
class wheel extends motion { public function wheel(){ // konstruktor super(); } public function move(){ super.rotate(); } }
Metody a vlastnosti rodičovské třídy jsou pak přístupné pomocí identifikátoru super. Samotný konstruktor rodičovské třídy můžete zavolat jako super().
Implementace rozhraní (implements)
Třída může také implementovat (naplnit, realizovat) vlastnosti rozhraní (interface).
class trida implements rozhrani { // implementace metod a vlastností rozhraní }
Podrobněji dále u rozhraní.
Rozhraní (interface)
Rozhraní podobně jako třída deklaruje metody, ale na rozdíl od třídy je neimplementuje.
interface Automobile { public function engine():Void; public function gearbox(speed:Number):Boolean; public function fuel(type:String):Boolean; }
O implementaci se stará až implementující třída. Ta musí implementovat všechny metody rozhraní a musí dodržet názvy funkcí, počty argumentů i jejich datové typy.
Rozhraní může deklarovat jen veřejné metody. Settery a gettery rozhraní deklarovat nemůže.
Dynamická třída (dynamic)
Vlastní třídu můžete označit jako dynamickou. Instancím této třídy pak bude možné dynamicky připojovat vlastnosti a metody, podobně jako generickému objektu.
dynamic class motion { var speed = 25; var ease = 0.5; var direction = 'CCW'; function motion(){ // konstruktor } }
V animaci pak instanci můžeme přidávat nové prvky:
var pohyb:motion = new motion(); pohyb.rotate = function(){ trace('vrrrrrr'); } pohyb.rotate(); // vrrrrrr
Pokud nemá proměnná instance omezen datový typ, je objekt vždy považován za dynamický (i když třída dynamická není). V AS3 už tohle neplatí.
Neplést prosím vlastnosti dynamic a static, nijak spolu nesouvisejí.
Vestavěná třída (intrinsic)
Trochu neobvyklý typ třídy pro typovou kontrolu starých AS1 objektů. Je to třída, která podobně jako interface deklaruje metody a vlastnosti - pouze však za účelem definování datových typů.
Z úvodu do objektů víte, že prototypy vytvořené za běhu (runtime) nemůžete typově omezovat. Respektive můžete, ale kompiler to bude ignorovat, protože runtime objekty on nevytváří.
To je ale celkem pakárna u vestavěných objektů jako je Array nebo String. Ty v AS2 implementuje až Flash player, v SWF binárce nejsou. Pak by ale kompiler nemohl kontrolovat datové typy u těchto objektů, protože by o nich nevěděl. Právě na to je intrinsic.
intrinsic class circle { function getArea(radius:Number):Number; }
V animaci se pak klasicky definuje prototyp:
function circle(){ this.getArea = function(radius){ return Math.PI * Math.pow(radius, 2); } } var kruh:circle = new circle(10); kruh.getArea(1); // 3.14 kruh.getArea('abc'); // Type mismatch;
Instance musí být typově omezena, aby kompiler použil pro kontrolu intrinsic třídu.
AS3 už intrinsic třídu nemá, runtime prototypy už nejdou vytvářet a prvky definované až přehrávačem se v interních třídách označují vlastností native.