vyuka:11._tridy_a_objekty._defince_tridy_dedicnost_staticke_tridy_dynamicke_tridy_atributy_metody_konstruktor_tridy_modifikatory_pristupu_public_private

Třídy a objekty. Defince třídy, dědičnost, statické třídy, dynamické třídy, atributy, metody, konstruktor třídy, modifikátory přístupu public, private

Jednou z výhod použití tříd v ActionScriptu je možnost kontroly správného přiřazení typů. Tato kontrola nám umožní vystříhat se řady zákeřných chyb.

Když např. bez využití tříd v timelinovém skriptu pleteme název proměnné a místo nazevVychylyk napíšeme nazevVýchylky pak v přiřazení:

var rozsahVychlky:Number=0;
...
x=rozsahVýchylky; 
...

se do proměnné x přiřadí hodnota undefined, protože proměnná rozsahVýchylky se bere jako nově definovaná (a v do ní jsme před tím nic nepřiřadili.

Když to napíšeme jako součást metody třídy, kompilátor nás hned upozorní, že používáme nedefinovanou proměnnou.

Definice třídy, atributů metod a konstruktoru

objekty se sdružují do tříd, třídy - sady objektů s obdobnými charakteristikami a schopnostmi (např. jako u lidí třída zbohatlíků, střední třída, pracující třída…) dají se třídit do balíčků - package

DEFINICE TŘÍDY

package jménoBalíčku { //jméno balíčku odpovídá adresáři, kde máme uložené třídy
import flash.display.MovieClip; //místo pro importování tříd, které budeme používat, cesta ke třídám -zjistíme v helpu
public class Jmeno_tridy extends MovieClip { //zápis třídy, její definice; naše třída zdědí všechny vlatnosti a metody movieClipu - DĚDIČNOST
var jmeno: String // místo pro atributy - proměnné - ATRIBUTY - chování třídy
var prijmeni: String
public function Jmeno_tridy() { //v každém konstruktoru musí být veřejná funkce
//KONSTRUKTOR má stejné jméno jako je jméno třídy, funkce která se vykoná vždy když vytváříme instanci dané třídy, slouží k inicializaci třídy (např. pokud chceme aby objekt reagoval na kliknutí myši, píšeme to sem)
addEventListener(MouseEvent.CLICK, jménoFunkceCoSeMáNaKliknutíVykonat)
}
//místo pro vlastní metody (funkce samotné třídy)
private function jménoFunkceCoSeMáNaKliknutíVykonat(e:MouseEvent) {
//co se má vykonat
}
 
}
}

MODIFIKÁTORY

když napíšeme před třídu PUBLIC, můžeme ji používat kdekoliv, i mimo balíček když napíšeme PRIVATE, můžeme ji použít pouze v balíčku protože je viditelná jen o jednu úroveň výš v AS

  // deklarace veřejných položek (atributů) dosažitelných i z vnějšku třídy
  // nazevInstance.NazevPromenne
  public var nazevVerejnePromenne:typPromenne;
  ...
  // deklarace statických položek (atributů) dosažitelných jako nazevTridy.nazevPromenne
  public static var nazevPromenne:TypPromenne
  ....
  // deklarace privátních položek dosažitelných jen zevnitř třídy
   private var nazevPrivatniPromenne:TypPromenne;
  ...
  //konstruktor
  public function nazevTridy(){
   //tělo konstruktoru - funkce, která se zavolá při inicializaci instance třídy
   ...
  }
 
  // veřejné metody - funkce dosažitelné i z vnějšku tříty jako: nazevInstance.metoda();
  public function verejnaMetoda(){
   ...
  }
  ...
  // statická metoda - dosažitelná z vnějšku třídy jako nazevTridy.statickaMetoda()
  static function statickaMetoda(){
  ...
  }
  ...
}

Dědičnost

Z rodičovské třídy dědíme všechny proměnné a metody. V praxi ActionScriptu je nejčastější dědění s třídy MovieClip - všechny vaše nové symboly v knihovně jsou potomci třídy MovieClip a tedy mají všechny metody (startDrag(), stopDrag(), hitTest()…atf.) a vlastnosti (_visible, _x, _y …atd) MovieClipu.

Deklarace deědičnosti je přes klíčove slovo extends (rozšiřuje):

class nazevTridy extends MovieClip {
 
}

Statické atributy (proměnné)

Někdy chceme, aby atribut (proměnná) třídy byl společný pro všechny instance třídy a ani aby jeho použití ani nevyžadovalo vytvořit žádnou instanci třídy. Nejčastěji se to týká třeba definice společných konstant.

Syntaxe využití statických atributů: názevTtřídy.názevAtributu.

Například hodnota konstanty je dosažitelná přes statickou třídu Math jako: Math.PI.

Syntaxe definice statického atributu v definici třídy: static vat NázevAtributu:TypAtributu;

Když se mění její hodnota, tak se nepíše už jménoInstance.jménoProměnné=hodnota, ale jen jménoProměnné=hodnota

Statické metody

Obdobně jako statické atributy mohou být definovány statické metody.

Syntaxe využití statických metod: názevTtřídy.názevMetody().

Např. volání metody Math.random() vrátí náhodné číslo od 0 do jedničky.

Syntaxce statické metody v definici třídy pomocí klíčového slova static:

...
//static function(){
      ....
  }
....

Statické třídy

Pomocí klíčového slova static můžeme označit i celou třídu. Tato třída pak nemůže mít instanci - všechny její členové jsou statické. Takovou třídou je např.třída Math:

Speciální druh třídy - nemůžeme(nemusíme) vytvářet její instance. Všechny její proměnné a metody, které jsou v ní, jsou také statické. K metodám a proměnným přistupujeme přes samotné jméno funkce (bez oslovení instance nebo třídy) např třída Mouse(obsahuje funkce myši - kliknutí, Drag, drop atd.), nebo Math(obsahuje různé matematické funkce) - jsou definované uvnitř flashe a už jen používáme jejich funkce.

static class NazevStatickeTridy{
....
 
}

Využití statických metod pro provázání movieklipů

Statické funkce třídy můžeme volat odkudkoli z hloubi movieClipů, a statické funkce mohou zavolat instance movieclipů - statická třída se dá využit jako přepínač.

příklad:

class Prepinac {
	static var podkladovyMovieClip:MovieClip;
	public static function stisknutoStroje() {
		trace("stisknutoStroje");
		loadMovie("pas_stroje.swf", _root);
	}
	public static function stisknutoClovek() {
		trace("stisknutClovek");
		loadMovie("pas_clovek.swf", _root);
	}
	public static function stisknutoMenu() {
		trace("stisknutoMenu");
		loadMovie("panoramaTest.swf", _root);
	}
	public static function stisknutoChlapecek() {
		podkladovyMovieClip.createEmptyMovieClip("box", podkladovyMovieClip.getNextHighestDepth());
		podkladovyMovieClip._root.skryjTlacitka();
		podkladovyMovieClip.box.loadMovie("plice_vysvetleni.swf");
	}
	public static function stisknutoZrouti() {
		podkladovyMovieClip.createEmptyMovieClip("box", podkladovyMovieClip.getNextHighestDepth());
		podkladovyMovieClip._root.skryjTlacitka();
		podkladovyMovieClip.box.loadMovie("potravni_retezec_vysvetleni.swf");
	}
	public static function stisknutoBabicka() {
		podkladovyMovieClip.createEmptyMovieClip("box", podkladovyMovieClip.getNextHighestDepth());
		podkladovyMovieClip._root.skryjTlacitka();
		podkladovyMovieClip.box.loadMovie("srdce_vysvetleni.swf");
	}
	public static function stisknutoKopac() {
		podkladovyMovieClip.createEmptyMovieClip("box", podkladovyMovieClip.getNextHighestDepth());
		podkladovyMovieClip._root.skryjTlacitka();
		podkladovyMovieClip.box.loadMovie("svaly_vysvetleni.swf");
	}
	public static function stisknutoDrozka() {
		trace("stisknutoDrozka");
		podkladovyMovieClip.createEmptyMovieClip("box", podkladovyMovieClip.getNextHighestDepth());
		podkladovyMovieClip._root.skryjTlacitka();
		podkladovyMovieClip.box.loadMovie("drozka_vysvetleni.swf");
	}
	public static function stisknutoParniStroj() {
		podkladovyMovieClip.createEmptyMovieClip("box", podkladovyMovieClip.getNextHighestDepth());
		podkladovyMovieClip._root.skryjTlacitka();
		podkladovyMovieClip.box.loadMovie("parni_stroj_vysvetleni.swf");
	}
	public static function stisknutoParnik() {
		podkladovyMovieClip.createEmptyMovieClip("box", podkladovyMovieClip.getNextHighestDepth());
		podkladovyMovieClip._root.skryjTlacitka();
		podkladovyMovieClip.box.loadMovie("parnik_vysvetleni.swf");
	}
	public static function stisknutoLokomotiva() {
		podkladovyMovieClip.createEmptyMovieClip("box", podkladovyMovieClip.getNextHighestDepth());
		podkladovyMovieClip._root.skryjTlacitka();
		podkladovyMovieClip.box.loadMovie("lokomotiva_vysvetleni.swf");
	}
	public static function stisknutoAuto() {
		podkladovyMovieClip.createEmptyMovieClip("box", podkladovyMovieClip.getNextHighestDepth());
		podkladovyMovieClip._root.skryjTlacitka();
		podkladovyMovieClip.box.loadMovie("auto_vysvetleni.swf");
	}
	public static function stisknutoTirak() {
		podkladovyMovieClip.createEmptyMovieClip("box", podkladovyMovieClip.getNextHighestDepth());
		podkladovyMovieClip._root.skryjTlacitka();
		podkladovyMovieClip.box.loadMovie("tirak_vysvetleni.swf");
	}
	public static function stisknutoLetadlo() {
		podkladovyMovieClip.createEmptyMovieClip("box", podkladovyMovieClip.getNextHighestDepth());
		podkladovyMovieClip._root.skryjTlacitka();
		podkladovyMovieClip.box.loadMovie("letadlo_vysvetleni.swf");
	}
	public static function stisknutoRaketa() {
		podkladovyMovieClip.createEmptyMovieClip("box", podkladovyMovieClip.getNextHighestDepth());
		podkladovyMovieClip._root.skryjTlacitka();
		podkladovyMovieClip.box.loadMovie("raketa_vysvetleni.swf");
	}
	public static function stisknutoZavrit() {
		trace("stisknutoZavrit");
		podkladovyMovieClip.box.unloadMovie();
		podkladovyMovieClip._root.ukazTlacitka();
	}
}

Dynamické třídy

Dynamické třídy jsou všechny třídy, v nichž můžeme dodefinovávat atributy a metody v jejich instancích. Tyto atributy (tj. proměnné), nebo metody (tj. funkce) platí ne pro celou řídu ale jen pro danou instanci. Není v tom nic tajemného - znáte to z praxe. Dynamickou třídou je např. třída MovieClip. Z praxe víte, že si vytažením instanci nějakého symbolu zu knihovny na plochu uděláte instanci symbolu (typu MovieClip) a v časové ose této instance instanci můžete ActionScriptovým skriptem definovat nějaké proměnné.

Dynamickou třídou je třída Object. Můžete vytvářet instance této třídy a v těchto instancích pak definovat atributy. Toho se často byužívá, když chcete funkcí vrátit více proměnných. Tak např.

function NejakaFunkce{):Object{
//funkce vrací proměnnou typu object
     ... 
     var o:Objet=new Object();//dekůarace instance o typu Object
    ...
    ....
 
    o.vzdalenost=nějakaHodnota; //přiřazení do dynamicjy vytvopřeného atributu 
 
    o.vyska=nějakáJináHodnoty; //přiřazení do dynamicky vytvořeného atributu
 
   return o; //funkce vrací dvě hodnoty jako atributy instance třídy Object
}
vyuka/11._tridy_a_objekty._defince_tridy_dedicnost_staticke_tridy_dynamicke_tridy_atributy_metody_konstruktor_tridy_modifikatory_pristupu_public_private.txt · Poslední úprava: 2011/11/25 10:45 autor: verca