Mostenirea este unul din cele mai utile instrumente ale Programarii Orientate pe Obiect - OOP.
Prin mostenire se intelege transmiterea proprietatilor, constanttelor si a functiilor de la o clasa la alta, intr-o structura ierarhica. Prima clasa este clasa de baza, denumita "parinte", legata de aceasta se poate crea o sub-clasa, denumita "copil"; sub-clasa 'copil' mosteneste proprietatile si metodele clasei 'parinte', le poate folosi in instructiunile din propriul cod si le transmite cand se creaza o instanta de obiect la ea. Precum in natura copii mostenesc genele parintilor.
Iata cum se aplica acest procedeu in programarea ActionScript 3. Vom folosi urmatoarea clasa de baza, "Mover", prin care se pot misca obiecte in prezentarea Flash. Obiectul care trebuie miscat si viteza de miscare pe axa X/Y sunt transferati ca argumente la crearea instantei clasei (explicatii gasiti in cod).
// Se creaza package simplu (fara nume) package { // Importare clase predefinite ActionSscript 3 folosite in aceasta import flash.events.Event; import flash.display.MovieClip; // Start definire clasa Mover public class Mover { // Setare proprietati // 'insMC' - pt. instanta MovieCpli, 'xVel' - pt. viteza pe orizontala, 'yVel' - pt. viteza pe verticala public var insMC:MovieClip; public var xVel:Number; public var yVel:Number; // Creare metoda constructor, preia ca argumente o instanta si 2 valoari numerice function Mover(inMC:MovieClip, xV:Number, yV:Number) { // Atribuie proprietatilor clasei valorie din parametri this.insMC = inMC; this.xVel = xV; this.yVel = yV; } // Creare metoda cu atribut "protected" (poate fi utilizata doar in aceasta clasa si sub-clasele ei) protected function updatePosition(evtObj:Event):void { // Incrementeaza distanta 'x' si 'y' a lui "insMC" cu valoarea proprietatilor "xVel" si "yVel" this.insMC.x += this.xVel; this.insMC.y += this.yVel; } // Definire metoda publica pt. start miscare public function startMove():void { // Aplica detectare Eveniment ENTER_FRAME la 'insMC' // si apeleaza metoda protejata, updatePosition this.insMC.addEventListener(Event.ENTER_FRAME, this.updatePosition); } // Definire metoda publica pt. stop miscare public function stopMove():void { // Sterge detectarea evenimentului setat in "startMove()" insMC.removeEventListener(Event.ENTER_FRAME, this.updatePosition); } } }- Ca sa testati aceasta clasa, efectuati urmatorii pasi:
// Creare instanta la clasa Mover var obj:Mover = new Mover(sfer, 2, 3); obj.startMove(); // Apelare metoda "startMove()" // Apeleaza metoda "stopMove" dupa 3 secunde (3000 milisecunde) // "stopMove" sterge inregistrarea evenimentului ENTER_FRAME, fapt ce opreste miscarea setTimeout(obj.stopMove, 3000);- "setTimeout()" apeleaza o functie /metoda dupa un anumit timp (dat in milisecunde).
// Se creaza package simplu (fara nume) package { // Importare clase a caror proprietati si metode vor fi apelate in aceasta clasa import flash.display.MovieClip; import flash.events.Event; import Mover; // Importare clasa de baza (parinte) // Incepere definire sub-clasa (copil) a clasei Mover public class MoverChild extends Mover { // Metoda constructor a clasei copil (primeste 3 argumente, un obiect Movie Clip si 2 numere) public function MoverChild(inMC:MovieClip, xV:Number, yV:Number) { // Apeleaza Metoda Constrctor a clasei parinte, cu argumentele primite la parametri super(inMC,xV,yV); } // Functie pentru schimbarea directiei de miscare cand obiectul ajunge la margine // Cu 4 if-uri pt. verificarea pozitiei obiectului pt. fiecare latura private function bounceAtBorder():void { // Verifica daca obiectul a ajuns in marginea din dreapta // Scazand din lungimea Scenei (this.insMC.stage.stageWidth) jumatate din lungimea obiectului (this.insMC.width/2) // (jumatate deoarece se considera obiecul MovieClip respectiv creat cu centrul de inregistrare in mijloc) if(this.insMC.x > this.insMC.stage.stageWidth-(this.insMC.width/2)) { // Seteaza distanta 'x' cu valoarea data de lungimea Scenei minus jumate din lungimea obiectului // Face negativa valoarea proprietatii pt. viteza de miscare orizontala (pt. a schimba directia) this.insMC.x = this.insMC.stage.stageWidth-(this.insMC.width/2); xVel *= -1; } // Verifica daca obiectul a ajuns in marginea de jos // Scazand din inaltimea Scenei (this.insMC.stage.stageHeight) jumatate din inaltimea obiectului (this.insMC.height/2) if (this.insMC.y > this.insMC.stage.stageHeight-(this.insMC.height/2)) { // Seteaza distanta 'y' cu valoarea data de inaltimea Scenei minus jumate din inaltimea obiectului // Face negativa valoarea proprietatii pt. viteza de miscare verticala (pt. a schimba directia) this.insMC.y = this.insMC.stage.stageHeight-(this.insMC.height/2); yVel *= -1; } // Verifica daca obiectul a ajuns in marginea din stanga //(distanta 'x' mai mica decat jumatate din lungimea oiectului) if (this.insMC.x < this.insMC.width/2) { // Seteaza distanta 'x' cu valoarea data de jumatatea lungimii obiectului // Face negativa valoarea proprietatii pt. viteza de miscare orizontala this.insMC.x = this.insMC.width/2; xVel *= -1; } // Verifica daca obiectul a ajuns in marginea de sus //(distanta 'y' mai mica decat jumatate din inaltimea oiectului) if (this.insMC.y < this.insMC.height/2) { // Seteaza distanta 'y' cu valoarea data de jumatatea inaltimii obiectului // Face negativa valoarea proprietatii pt. viteza de miscare verticala this.insMC.y = this.insMC.height/2; yVel *= -1; } } // Rescrie metoda "updatePosition()", definita in clasa parinte, Mover override protected function updatePosition(evtObj:Event):void { // Apeleaza /Include codul metodei "updatePosition()" din clasa de baza super.updatePosition(evtObj); bounceAtBorder(); // Adauga apelarea metodei "bounceAtBorder()" definita mai sus } } }- Despre rolul instructiunilor folosite gasiti explicatii in cod.
// Creare instanta la clasa MoverChild var obj2:MoverChild = new MoverChild(sfer, 2, 3); obj2.startMove(); // Apelare metoda "startMove()"- Observati ca, desi nu exista metoda "startMove()" in clasa "MoverChild", aceasta este apelata prin instanta acestei clase, si functioneaza deoarece e mostenita de la clasa parinte ca si cum ar fi scrisa si in ea.
Dupa formula prezentata mai sus se pot defini mai multe clase copil ca extinderi a clasei de baza, dar se pot crea si subclase ale clasei copil, astfel, clasa copil devine "parinte" a sub-claselor extinse din ea, acestea fiind ca niste nepoti a clasei principale, de baza.
• Clasele "nepot" nu pot mosteni direct proprietatile si metodele clasei "bunic", ci prin intermediul clasei din care sunt extinse.
// Se creaza package simplu (fara nume) package { // Importare clase a caror proprietati si metode vor fi apelate in aceasta clasa import flash.display.MovieClip; import flash.events.Event; import MoverChild; // Importare clasa din care va fi extinsa // Incepere definire sub-clasa MoverChildG (copil) a clasei MoverChild public class MoverChildG extends MoverChild { // Se definesc proprietatile proprii acestei clase // cu atribut "private" deoarece se folosesc doar in codul ei private var streng: Number; private var lastPosX: Number; private var lastPosY: Number; // Metoda constructor a clasei // Pe langa atributele necesare clasei din care este extinsa, mai adauga un parametru "streng" (pt. puterea de miscare) // ('stren' avand atribuita si o valoare, face optionala adauarea lui la crearea instantei in script) public function MoverChildG(inMC:MovieClip, xV:Number, yV:Number, streng:Number=1) { // Apeleaza Metoda Constrctor a clasei parinte (la care este extinsa) super(inMC, xV, yV); // Atribuie proprietatii 'streng' valoarea parametrului "streng" // S-a dat parametrului acelasi nume cu al proprietatii pt. a se sti mai bine rolul lui (dar poate avea si alt nume) this.streng = streng; } // Rescrie metoda "updatePosition()", definita (tot ca rescriere) in clasa parinte, MoverChild override protected function updatePosition(evtObj:Event):void { // Include /Pastreaza codul initial al acestei metode si adauga alte 3 instructiuni (apelari a unor functii interne) super.updatePosition(evtObj); this.applyGravity(); this.applyFriction(); this.checkForStop(); } /* Se definesc functiile interne, private, deoarece sunt necesare doar in interiorul acestui cod */ // Mareste viteza pe axa Y cu valoare proprietatii 'streng' private function applyGravity():void { this.yVel += this.streng; } // Adauga coeficientul de gravitate G (0.98) la viteza de pe axele X si Y // care, prin inmultire (fiind mai mica decat 1) are ca rezultat micsorarea valori lor private function applyFriction():void { this.xVel *= 0.98; this.yVel *= 0.98; } // Functia pt. verificarea momentului cand miscarea s-a oprit // In acel moment apeleaza metoda "stopMove" din clasa de baza (pt. eficientizarea codului) // ("stopMove" sterge inregistrarea evenimentului de detectare ENTER_FRAME, // ne fiind necesar dupa oprire, elibereaza memoria ocupata de acest eveniment) private function checkForStop():void { // Daca pozitia X si Y a obiectului este aceeasi cu ultima inregistrata if(this.insMC.x == this.lastPosX && this.insMC.y == this.lastPosY) { this.stopMove(); // Apeleaza metoda "stopMove" } // Retine in proprietatile 'lastPosX' si 'lastPosY' ultima pozitie a obiectului this.lastPosX = this.insMC.x; this.lastPosY = this.insMC.y; } } }- Explicatii despre instructiunile folosite gasiti in documentatia din cod.
// Creare instanta la clasa MoverChildG var obj3:MoverChildG = new MoverChildG(sfer, 15, 30, 2); obj3.startMove(); // Apelare metoda "startMove()"- Daca apasati "Ctrl+Enter", rezultatul va fi miscarea obiectului precum se vede in prezentarea urmatoare (click pe imagine).
Exista posibilitatea de a bloca extinderea unei clase, sa nu mai transfere proprietatile si metodele ei vreunei sub-clase legata de ea. Pentru aceasta se adauga termenul final inaintea cuvantului class
De exemplu:
package {
public final class numeClasa {
// Instructiuni ...
}
}
<ul> <li>http://coursesweb.net/html/</li> <li>http://www.marplo.net/html/</li> </ul>
.some_class { display: list-item; }
var obj = { "courses": ["php", "javascript", "ajax"] }; var jsonstr = JSON.stringify(obj); alert(jsonstr); // {"courses":["php","javascript","ajax"]}
$strhtml = '<body><div id="dv1">CoursesWeb.net</div></body>'; $dochtml = new DOMDocument(); $dochtml->loadHTML($strhtml); $elm = $dochtml->getElementById("dv1"); echo $elm->nodeValue; // CoursesWeb.net
I`m living here. - Traiesc /Locuiesc aici.
Estoy viviendo aquĆ. - Traiesc /Locuiesc aici.