Flash.jpw

  • Obecné
  • Adobe Flash
  • ActionScript 1 & 2.0
  • ActionScript 3.0
  • ActionScript 1 & 2.0

  • Úvod do ActionScriptu
  • Proměnné, pole a generický objekt
  • Podmínky a smyčky
  • Funkce
  • Úvod do objektů
  • Vlastní třídy
  • Objekty CORE
  • Objekty MOVIE
  • Výjimky
  • Asynchronní události
  • Předchozí: Úvod do objektů
  • Následující: Objekty CORE
  • Vlastní třídy

    Třída je konstrukční plán prototypu pro kompiler. Pro vytváření vlastních objektů je vytvoření třídy nejlepší a preferovaný způsob - výhodný z hlediska programových možností i výkonu.

    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.

    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
    	}	
    }

    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.