2012-02-02 19 views
8

Wiele dziedziczenia w ActionScript 3? Czy to możliwe? Czytałem gdzieś, że jest to możliwe w as3.Wiele dziedziczenia w ActionScript 3

Jeśli tak, to w jaki sposób?

to moja Doucument Klasa 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'); 
     } 
    } 
} 

Innym jest sprzęgowi B.as

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

góry dzięki.

+7

można tylko * * przedłużyć z jednej klasy, ale można wdrożyć * * jako wiele interfejsów, jak chcesz. Co dokładnie próbujesz zrobić *, gdy mówisz "wielokrotne dziedziczenie"? –

+0

Zagłosowano na nieoczywiste pytanie. Osoba chce "wiele narzędzi" – WORMSS

+0

@WORMSS: nazywa się to dziedziczeniem wielokrotnym za pomocą interfejsu. –

Odpowiedz

73

Wielokrotne dziedziczenie nie jest możliwe w systemie AS. Ale dzięki interfejsom można naśladować niektóre funkcje dziedziczenia wielokrotnego. MI ma poważne wady, w szczególności problem z diamentem: http://en.wikipedia.org/wiki/Diamond_problem Dlatego wiele języków nie obsługuje MI, ale tylko pojedyncze dziedziczenie. Używając interfejsów "pojawia się", stosujesz MI, ale w rzeczywistości tak nie jest, ponieważ interfejsy nie zapewniają implementacji, ale tylko obietnicę funkcjonalności.

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 .: W przypadku chcesz się zastanawiać: Nie ma problemu romb z interfejsów Ponieważ implementor interfejsów musi dostarczyć dokładnie jedną realizację każdego członka określonej w interfejsach. Tak więc, nawet jeśli oba interfejsy będą definiować tego samego członka (z identycznym podpisem oczywiście), nadal będzie tylko jedna implementacja.

+0

Technicznie nie jest to dziedziczenie wielokrotne, które nie jest możliwe. Jednak patrząc na komentarz @ swati-singh wykonane avobe, wygląda na to, że chce wielu interfejsów i byłoby to prawidłowe rozwiązanie dla tego. – lordofthefobs

+22

Dlatego właśnie zacząłem swoją odpowiedź: "Wielokrotne dziedziczenie nie jest możliwe w AS". :) – Creynders

+0

@Creynders: wielkie dzięki, mam swój błąd ... :) –

0

Możesz dokonać dziedziczenia wielokrotnego za pomocą interfejsu.

  1. Należy zdefiniować klasy A, B i C. oraz zdefiniować interfejs dla klasy B i C odpowiednio iB i iC.
  2. Po prostu rozszerza klasę C na klasę A za pomocą słowa kluczowego "extend" - Direct Inheritance klasy
  3. rozszerza interfejs iC na interfejs 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

czy możesz to zaimplementować w moim przykładzie? –

+0

Witaj Swati, mogę zaimplementować w twoim przykładzie. Ale czy możesz wysłać mi swój przykładowy kod do mnie e-mailem, ponieważ w pytaniu wspomniałeś tylko o interfejsie B, klasie A, ale nie wymienionym interfejsie C. Potrzebuję kodu. mój adres e-mail to [email protected] – Mrugesh

+0

Mrugesh: mam błąd w C przez pomyłkę. zaktualizowałem swój kod, sprawdź to. dzięki za odpowiedź. –

4

Więc nie ma możliwości wielokrotnego dziedziczenia bezpośrednio w AS3 podobnie jak wiele innych języków OOP.

OOP polega na ponownym użyciu kodu i podobnie jak większość z nas chce ponownie użyć kodu napisanego w wielu klasach. Więc jeśli naprawdę chcesz ponownie użyć kodu (logiki) zamiast tylko podpisów, możesz rozważyć podejście składanie lub deligowanie i prawdopodobnie to jest to, co gdzieś przeczytałeś, tak jak powiedziałeś.

W składzie co musisz zrobić, to zamiast dziedziczy klasy bazowej do podklasy, trzeba będzie instancją klasy bazowej w podklasie i mają wszystkie metody

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(); 
     } 
    } 
} 

To nie jest hack ale faktycznie prawdziwa i praktyczną implementację przyjętą przez doświadczonych programistów w wielu wzorcach projektowych.

Mam nadzieję, że to pomoże