2012-02-02 12 views
8

Ereditarietà multipla in ActionScript 3? È possibile? Ho letto da qualche parte che è possibile in as3.Ereditarietà multipla in ActionScript 3

Se sì, allora come?

questo è il mio Doucument Classe A.as

package 
{ 
    import flash.display.MovieClip; 

    public class A extends MovieClip implements B 
    {  
     public var value1:Number=10; 

     public function A() 
     { 
      trace("A Class Constructor"); 
     } 
     public function hit():void 
     { 
      trace(value1+' from hit'); 
     } 
    } 
} 

Un altro è interfaccia B.as

package 
    { 
     public interface B 
     { 
      trace(' interface '); 
      function hit():void; 
     } 
    } 

Grazie in anticipo.

+7

È solo è possibile estendere * * da una singola classe, ma è possibile implementare * * come molte interfacce come ti piace Che cosa stai cercando di fare * do * quando dici "Multiple Ereditarietà"? –

+0

Votato per domande non chiare. La persona vuole 'Multiple Implements' – WORMSS

+0

@WORMSS: questo è chiamato ereditarietà multipla usando l'interfaccia. –

risposta

73

L'ereditarietà multipla non è possibile in AS. Ma con le interfacce è possibile imitare alcune delle funzionalità di ereditarietà multipla. MI ha grandi difetti, in particolare il problema dei diamanti: http://en.wikipedia.org/wiki/Diamond_problem Ecco perché molte lingue non supportano l'MI, ma solo l'ereditarietà singola. Utilizzando le interfacce "appare" si applica MI, ma in realtà non è il caso poiché le interfacce non forniscono un'implementazione, ma solo una promessa di funzionalità.

interface BadAss{ 
    function doSomethingBadAss():void; 
} 

interface Preacher{ 
    function quoteBible():void; 
} 

class CrazyGangsta implements BadAss, Preacher{ 
    function quoteBible():void{ 
     trace("The path of the righteous man is beset on all sides by the inequities of the selfish and the tyranny of evil men."); 
    } 
    function doSomethingBadAss():void{ 
     //do something badass 
    } 
} 

var julesWinnfield : CrazyGangsta = new CrazyGangsta(); 
julesWinnfield.doSomethingBadAss(); 
julesWinnfield.quoteBible(); 

//however, it mimics MI, since you can do: 

var mofo : BadAss = julesWinnfield; 
mofo.doSomethingBadAss(); 
//but not mofo.quoteBible(); 

var holyMan : Preacher = julesWinnfield; 
holyMan.quoteBible(); 
//but not holyMan.doSomethingBadAss(); 

P.S .: Nel caso in cui ci si domandi: non c'è nessun problema di diamanti con interfacce in quanto un implementor delle interfacce deve fornire esattamente un'implementazione di ciascun membro definito nelle interfacce. Quindi, anche se entrambe le interfacce definissero lo stesso membro (con la stessa firma ovviamente), ci sarà ancora una sola implementazione.

+0

Tecnicamente questa non è eredità multipla che non è possibile AS. Comunque guardando il commento @ swati-singh ha reso avobe, sembra che voglia un'interfaccia multipla e questa sarebbe una soluzione corretta per questo. – lordofthefobs

+22

Ecco perché ho iniziato la mia risposta con: "L'ereditarietà multipla non è possibile in AS". :) – Creynders

+0

@Creynders: grazie mille, ho sbagliato ... :) –

0

È possibile eseguire l'ereditarietà multipla tramite l'interfaccia.

  1. Definire le classi A, B e C. e definire l'interfaccia per la classe B e C rispettivamente iB e iC.
  2. Estende semplicemente la classe C alla classe A utilizzando la parola chiave "estendere" - Eredità diretta della classe
  3. estende l'interfaccia iC all'interfaccia iB.
Just check code as per your requirement: 

package 
{ 
    import flash.display.MovieClip; 
    public class A extends MovieClip implements B 
    { 
     public var value1:Number=10; 
     public function A() 
     { 
      trace("A Class Constructor"); 
     } 
     public function hit():void 
     { 
      trace(value1+' from hit'); 
     } 
     public function print():void 
     { 
      trace("Print Method Called"); 
     } 
    } 
} 

package 
{ 
    public interface B extends D 
    { 
     function hit():void; 
    } 
} 

package 
{ 
    public class C implements D 
    { 
     pulic function C() 
     { 
      trace("C Class Constructor"); 
     } 
     public function print():void 
     { 
      trace("Print Method Called"); 
     } 
    } 
} 

package 
{ 
    public interface D 
    { 
     function print():void; 
    } 
} 
+0

puoi implementarlo nel mio esempio? –

+0

Ciao Swati, posso implementare nel tuo esempio. Ma puoi inviarmi il tuo codice di esempio via email perché nella tua domanda hai menzionato solo l'interfaccia B, l'interfaccia di classe A ma non citato. Quindi ho bisogno di codice. il mio indirizzo email è [email protected] – Mrugesh

+0

Mrugesh: ho wriiten C per errore. ho aggiornato il mio codice, per favore controllalo. grazie per la tua risposta. –

4

Beh non v'è alcuna possibilità di ereditarietà multipla direttamente in AS3 come molti altri linguaggi OOP.

OOP riguarda il riutilizzo del codice e come la maggior parte di noi desidera riutilizzare il codice scritto in più classi. Quindi, se vuoi davvero riutilizzare il codice (logica) invece delle sole firme, potresti considerare la composizione composizione o deligation e probabilmente questo è ciò che hai letto da qualche parte, come hai detto tu.

in Composizione quello che fai è invece di ereditare un baseclass nella sottoclasse, si avrà un'istanza dei baseclass in una sottoclasse e hanno tutti i metodi

package 
{ 
    public class BaseClass1 
    { 
     public function someMethod() 
     { 
      trace("This is from the BaseClass1"); 
     } 
    } 
} 

package 
{ 
    public class BaseClass2 
    { 
     public function anotherMethod() 
     { 
      trace("This is from the BaseClass2"); 
     } 
    } 
} 
package 
{ 
    //Composition 
    public class HasBase 
    { 
     private var baseClass1:BaseClass1; 
     private var baseClass2:BaseClass2; 
     public function HasBase() 
     { 
      baseClass1=new BaseClass1(); 
      baseClass2=new BaseClass2(); 
     } 
     public function someMethod() 
     { 
      baseClass1.someMethod(); 
     } 
     public function anotherMethod(){ 
      baseClass2.anotherMethod(); 
     } 
    } 
} 

Questo non è un trucco, ma in realtà un vero e proprio e implementazione pratica adottata da sviluppatori esperti in molti modelli di progettazione.

Spero che questo aiuti