Интерфейс Actionscript 3 - я не понимаю (вопрос новичка) - PullRequest
4 голосов
/ 20 августа 2011

Из того, что я прочитал, интерфейсы - это в основном классы для методов, верно? Если два класса реализуют один и тот же интерфейс, то оба они должны иметь методы, описанные в интерфейсе.

Теперь, как это полезно? Допустим, я хочу вызвать foo ();.

public interface IExample {
    function foo(om:String):void;
}

class HungryClass implements IExample{
    public function foo(om:String):void{
        trace("OM NOM NOM!!! Thank you for feeding me" + om);
    }
}

class FullClass implements IExample{
    public function foo(om:String):void{
        trace("No thanks, I don't want to eat" + om);
    }
}

//somewhere..
instanceOfEitherClass.foo("cake");

Как помогает интерфейс? Разве это не сработает без взаимодействия?

Спасибо

Ответы [ 7 ]

5 голосов
/ 20 августа 2011

Допустим, у вас есть конкретный класс, который наследуется от абстрактного класса.В этом случае вы просто сделаете следующее:

public class ConcreteClass extends AbstractClass

А что если вам нужен конкретный класс для наследования от класса EventDispatcher?Вы не можете сделать следующее:

public class ConcreteClass extends AbstractClass, EventDispatcher

Однако вы можете реализовать интерфейс IEventDispatcher класса EventDispatcher и затем использовать объект EventDispatcher, например:

internal class ConcreteClass extends AbstractClass implements IEventDispatcher
{
    private var _eventDispatcher:EventDispatcher;

    public function ConcreteClass()
    {
        _eventDispatcher = new EventDispatcher(this);

    }// end function

    public function addEventListener(type:String, 
                                     listener:Function, 
                                     useCapture:Boolean = false, 
                                     priority:int = 0, 
                                     useWeakReference:Boolean = false):void
    {
        _eventDispatcher.addEventListener(type, listener, useCapture, priority, useWeakReference);

    }// end function

    public function dispatchEvent(event:Event):Boolean
    {
        return _eventDispatcher.dispatchEvent(event);

    }// end function

    public function hasEventListener(type:String):Boolean
    {
        return _eventDispatcher.hasEventListener(type);

    }// end function

    public function removeEventListener(type:String, 
                                        listener:Function, 
                                        useCapture:Boolean = false):void
    {
        _eventDispatcher.removeEventListener(type, listener, useCapture);

    }// end function

    public function willTrigger(type:String):Boolean
    {
        return _eventDispatcher.willTrigger(type);

    }// end function

}// end class

Используя эту комбинацию композиции и интерфейсов, вы можете использовать конкретный класс как объект AbstractClass и EventDispatcher.

Интерфейсы отлично подходят для того, чтобы "не связанные объекты могли взаимодействовать друг с другом".Вы можете найти больше информации об интерфейсах здесь .

2 голосов
/ 20 августа 2011

Вот пример, который может помочь вам немного лучше понять.

public interface IPlayableItem {
  function playMe():void;
}

public class VideoPlayer implements IPlayableItem {
  public function playMe():void {
    //do video playing stuff here
  }
}


public class AudioPlayer implements IPlayableItem {
  public function playMe():void {
    //do audio playing stuff here
  }
}


public class SlideShowPlayer implements IPlayableItem {
  public function playMe():void {
    //do image slideshow stuff here
  }
}

public class Main {
  public var myPlayables:Array = new Array();

  public function Main() {
    buildMyItems();
    runMyItems();
  }

  public function buildMyItems():void {
    myPlayables.push(new VideoPlayer());
    myPlayables.push(new AudioPlayer());
    myPlayables.push(new SlideShowPlayer());
  }

  public function runMyItems():void {
    for each (var item:IPlayableItem in myPlayables) {
       item.playMe();
    }
  }
}

В этом случае не имеет значения, как каждый элемент должен реализовывать код, необходимый для каждого для воспроизведения (каждый из них будетзаметно отличается в этом случае).Но он предоставляет общий интерфейс для взаимодействия с каждым из них, поэтому для других классов не важно, как каждый класс, реализующий интерфейс, выполняет то, что ему нужно.

1 голос
/ 27 апреля 2016

Похоже, довольно много людей пытались объяснить использование интерфейсов здесь, но почему-то я чувствую, что реальное использование интерфейсов здесь не отражено. Хотя это вполне объяснимо в любой книге по объектно-ориентированному анализу и проектированию, я изложу это своими словами ниже.

По моему мнению, одно из основных применений Интерфейсов - сделать возможной архитектуру плагинов. Что такое плагин? Плагин - это часть логики, которая расширяет функциональность базового приложения без необходимости перекомпиляции базового приложения. Короче говоря, кто-то определяет интерфейс один раз, а другие, которые пишут свой код для реализации этого интерфейса, могут вставить свой новый код в старое приложение, расширяя его по своему выбору.

Например, давайте возьмем популярный случай музыкального проигрывателя Winamp. Разработчики Winamp определили архитектуру, которая позволяет создавать плагины для различных вещей. Например, у вас может быть плагин, который записывает воспроизводимый в настоящее время MP3 в виде файла WAV. Или плагин «Virtual Surround», который берет обычный mp3 и делает его звучание намного лучше.

Здесь следует отметить, что разработчик Winamp мог и не предполагать, что его плеер может быть «расширен» для выполнения определенной задачи. Он бы просто определил все операции, которые могут быть выполнены плагином. Например, он мог определить интерфейс IMusicOperation, как показано ниже

public interface IMusicOperation
{
   function Play():void;
   function Pause():void;
   function TrackSeekTo(offset:double):void;  
}

Когда я, как разработчик плагинов, реализую этот интерфейс, он позволяет мне управлять Winamp любым удобным для меня способом. Например, у меня может быть веб-служба, которая позволяет кому-то управлять Winamp из удаленного местоположения.

Еще одна практическая аналогия, которую я считаю полезной, - это интерфейс для управления транспортным средством в игре.

public interface IDriveVehicle
{
  function Start():void;
  function Stop():void;
  function TurnLeft():void;
  function TurnRight():void;
}

Теперь, большая часть заключается в том, что если какой-либо автомобиль (будь то ракета, космический корабль, автомобиль, велосипед, лодка, подводная лодка) реализует этот интерфейс, мой игровой код может манипулировать этим транспортным средством без необходимости знать что-либо больше о нем. Самое приятное, что даже через несколько лет после того, как моя игра вышла на рынок, кто-то мог «добавить» новый космический корабль в мою игру, просто создав плагин, соответствующий моему интерфейсу IDriveVehicle.

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

Для получения дополнительной информации это выглядит как хорошая ссылка ... http://www.cs.utah.edu/~germain/PPS/Topics/interfaces.html

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

1 голос
/ 20 августа 2011

Я задавался этим вопросом сам.Из бесед с коллегами (которые также занимаются той же темой):

  • Interface s сообщит вашему компилятору / среде выполнения, какие функции доступны быстро для потенциально хорошего повышения производительности в зависимости от языка (и компилятор).
  • В среде team , Interface может сообщить другим разработчикам, какие функции необходимы.Возможно, по имени они могут легко расшифровать то, что нужно функции внутри нее.
  • Подобно структуре столбцов в ваших "стандартных" базах данных, Interface аккуратно заблокирует вас в одной и той же компоновке метода для нескольких классов.Это удобно для больших проектов с большим * продолжительным * и / или полиморфизмом , потому что ваш компилятор "напомнит" вам, если вы пропустили реализацию метода.

Также, Senocular охватывает это в одном из его OOP artciles .Он умный парень, когда дело доходит до AS3.

0 голосов
/ 16 мая 2017

По существу, интерфейсы в основном служат для предоставления ссылки на общую функцию в нескольких различных классах, которые реализовали указанный интерфейс.

0 голосов
/ 21 августа 2011

аналогии с едой более чем используются в программировании, но мне нравится думать об интерфейсах как об обязательных ингредиентах для рецепта, поэтому интерфейсы можно использовать как руководство для дизайна класса.

public interface IChocolateChipCookies
{
     function butter(amount:Number):void;
     function sugar(amount:Number):void;
     function eggs(amount:Number):void;
     function vanillaExtract(amount:Number):void;
     function flour(amount:Number):void;
     function water(amount:Number):void;
     function salt(amount:Number):void;
     function walnuts(amount:Number):void;
     function chocolateChips(amount:Number):void;
}

, затем используйте этоинтерфейс в вашем классе:

public class BakeCookies extends Sprite implements IChocolateChipCookies
{
     public function BakeCookies()
     {

     }

     //must include all functions (ingredients) from IChocolateChipCookies
     //in this class in order to make the cookies correctly!

     private function butter(amount:Number):void
     {

     }

     private function sugar(amount:Number):void
     {

     }

     private function eggs(amount:Number):void
     {

     }

     private function vanillaExtract(amount:Number):void
     {

     }

     private function flour(amount:Number):void
     {

     }

     private function water(amount:Number):void
     {

     }

     private function salt(amount:Number):void
     {

     }

     private function walnuts(amount:Number):void
     {

     }

     private function chocolateChips(amount:Number):void
     {

     }
}
0 голосов
/ 20 августа 2011

Да, это работает без взаимодействия.

Я думаю, что это более полезно, когда вы хотите перенести классы в вектор.Вы могли бы сделать такой вектор:

var myExampleList:Vector.<IExample> = new Vector.<IExample>();
myExampleList.push(new HungryClass());
myExampleList.push(new FullClass());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...