Множественное наследование в ActionScript 3 - PullRequest
8 голосов
/ 02 февраля 2012

Множественное наследование в ActionScript 3?Является ли это возможным?Я где-то читал, что это возможно в as3.

Если да, то как?

это мой класс Doucument 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');   
        }
    }
}

Другой - интерфейс B.as

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

Заранее спасибо.

Ответы [ 4 ]

73 голосов
/ 02 февраля 2012

В AS невозможно множественное наследование. Но с помощью интерфейсов вы можете имитировать некоторые функции множественного наследования. У MI есть серьезные недостатки, прежде всего проблема с алмазами: http://en.wikipedia.org/wiki/Diamond_problem Вот почему многие языки не поддерживают MI, а только одиночное наследование. Используя интерфейсы, «кажется» вы применяете MI, но на самом деле это не так, поскольку интерфейсы не обеспечивают реализацию, а только обещают функциональность.

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

П.С .: Если вам интересно: С интерфейсами нет проблем с бриллиантами, так как разработчик интерфейсов должен обеспечить ровно одну реализацию каждого члена, определенного в интерфейсах. Таким образом, даже если оба интерфейса будут определять один и тот же элемент (с идентичной подписью, конечно), все равно будет только одна реализация.

4 голосов
/ 25 ноября 2012

Что ж, в AS3 нет возможности множественного наследования напрямую, как во многих других языках ООП.

ООП - это повторное использование кода, и, как и большинство из нас, хотят повторно использовать код, написанный в нескольких классах.Поэтому, если вы действительно хотите повторно использовать код (логику), а не только сигнатуры, вы можете рассмотреть подходы Composition или Deligation , и, вероятно, это то, что вы где-то читали, как выsaid.

В композиции вместо наследования базового класса в подкласс вы будете иметь экземпляр базового класса и иметь все методы

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

Это нехак, но на самом деле реальная и практическая реализация, принятая опытными разработчиками во многих шаблонах проектирования.

Надеюсь, это поможет

0 голосов
/ 13 августа 2014

Умм, ребята!

Я могу показать вам два разных способа "имитировать" множественное наследование:

  1. Использование функции #import: http://archive.darronschall.com/weblog/2006/10/multiple-inheritance-in-actionscript-3.html

  2. Не забывайте, что ActionScript - это EcmaScript.Это все еще основанный на прототипе язык: http://jolierouge.net/2010/01/as3-multiple-inheritancemixins/

Я знаю ... не "настоящий" MI, но они выглядят как утка, говорят как утка ...

0 голосов
/ 02 февраля 2012

Вы можете сделать множественное наследование, используя интерфейс.

  1. Определите классы A, B и C. и Определите интерфейс для классов B и C соответственно iB и iC.
  2. Просто расширяет класс C до класса A, используя ключевое слово "extends"- Прямое наследование класса
  3. расширяет интерфейс iC до интерфейса 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;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...