Создание и реализация интерфейса (Interface) в ActionScript 3

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

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

В официальной справке AdobeFlash ActionScript 3 интерфейс имеет следующее определение:

«Интерфейс — это набор объявлений методов, который позволяет несвязанным объектам взаимодействовать друг с другом.»

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

Создание интерфейса в ActionScript 3

Класс интерфейса создается точно так же, как и другие типы классов, в "package", и сохраняется в отдельном AS-документе. Отличие в том, что вместо ключевого слова "class" используется ключевое слово "interface"; а также, в теле интерфейса описывается только список методов, без указания кода.

Основной синтаксис следующий:

package {
  public interface InterfaceName {
    function methodName(prop1:DataType, prop2:DataType, ...):DataType;
    function otherMethod(prop1:DataType, prop2:DataType, ...):DataType;
    ...........
  }
}

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

— Свойства не могут быть заданы.

Вот пример интерфейса с именем "ITest", в котором определены два метода: "Links()" и "Tutorials()".

package {
  // Создаем интерфейс
  public interface ITest {
    // Список с необходимыми методами
    function Links():void;
    function Tutorials(gen:String, nota:int):String
  }
}

— Этот код должен быть добавлен в документ "ActionScript 3.0 Class" (или "ActionScript 3.0 Interface"), запишите "ITest" в имени класса, и файл с этим кодом должен быть сохранен с именем "ITest.as", в той же папке, что и классы, которые будут реализовывать данный интерфейс.

Реализация интерфейса в ActionScript 3

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

Для реализации интерфейса используйте ключевое слово "implements" и имя интерфейса после имени класса:

public class ClassName implements InterfaceName {
  // Инструкции
}

— класс "ClassName" должен содержать все методы, определенные в интерфейсе "InterfaceName", с атрибутом «"public", необходимым количеством параметров и их типом данных, установленных в интерфейсе. Класс может также содержать другие методы.

В следующем примере мы создаем класс (с именем webDevelopment), в новом AS-документе, с именем "webDevelopment.as" и сохраняем его в ту же папку, что и интерфейс "ITest".

package {
  // Создаем класс, который реализует интерфейс ITest
  public class webDevelopment implements ITest
  {
    // Определяем защищенное свойство
    protected var site:String = 'jwinters.ru';

          /* Определяем необходимые методы (Links и Tutorials), указанные в интерфейсе */

    // Возвращается значение свойства 'site' в окне Output
    public function Links():void

    {
      trace(this.site);
    }

    // Возвращается значение переменной, которая принимает переданные аргументы
    public function Tutorials(gen:String, note:int):String
    {
      var re:String = gen+'-'+note;
      return re;
    }

    // создается дополнительный метод
    // Отображает полученный аргумент в окне Output
    public function Diverse(val:*):void
    {
      trace(val);
    }
  }
}

— Необходимые методы ("Links()" и "Tutorials()") соблюдают точные параметры (количество, порядок, тип данных), установленные в интерфейсе "ITest". Другие методы (в данном случае "Diverse") и свойства являются необязательными и зависят от роли каждого класса.

— В необходимых методах, имя параметров не имеет значения, но их количество, тип данных и порядок должны быть такими же, как и в интерфейсе.

Чтобы проверить этот пример, создайте в Flash новый документ, добавьте в панель Actions следующий код ActionScript, затем сохраните его в ту же директорию, где расположены вышеописанные интерфейс и класс.

// Создаем экземпляр объекта класса webDevelopment 
var obj:webDevelopment = new webDevelopment();

// Вызываем методы
obj.Links();                             // jwinters.ru
trace(obj.Tutorials('Flash', 8));        // Flash-8
obj.Diverse(2010);                       // 2010

— Поскольку класс "webDevelopment" соответствует условиям, указанным в реализованном интерфейсе (ITest), скрипт работает.

— Если какое-либо из условий не выполняется в классе: например, не определяется метод, добавляется дополнительный параметр или какой-либо параметр объявляется с другим типом данных; скрипт возвратит ошибку.

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

Интерфейс как тип данных

Интерфейс можно также применять как тип данных для переменных (или параметров функции). Затем переменная (или параметр) может представлять экземпляр класса, который реализует этот интерфейс.

Вы сможете понять это лучше из следующего примера, где мы создаем другой класс (с именем WebProgramming), который реализует интерфейс "ITest".

package {
  // Создаем класс, который использует интерфейс ITest 
  public class WebProgramming implements ITest
  {
    // Определение защищенного свойства
    protected var adr:String = 'jwinters.ru/';

          /* Определение требуемых методов (Links и Tutorials), указанных в интерфейсе */

    // Вовзращает строку в окно Output
    public function Links():void
    {
      trace('Have a good life');
    }

    // Возвращает значение переменной "re"
    public function Tutorials(gen:String, nr:int):String
    {
      var re:String = nr+'-'+ this.adr+gen;
      return re;
    }
  }
}

В FLA-документе, в панели "Actions" запишите следующий код.

// Создаем экземпляры классов, которые реализуют интерфейс 'ITest'
var web_development:webDevelopment = new webDevelopment();
var web_programming:WebProgramming = new WebProgramming();

// Создаем функцию с параметром, у которого в качестве типа данных интерфейс "ITest".

function courses(cls:ITest):void
{
  // Вызываем набор методов в ITest, через параметр "cls" 

  cls.Links();
  trace(cls.Tutorials('flash', 4));
}

// Вызываем функцию courses(), передавая параметр экземпляров, созданных выше

courses(web_development);    // В окне Output отображается: "jwinters.net" and "flash-4"
courses(web_programming);   // В окне Output отображается: "Have a good life" and "4-jwinters.ru/flash"

— Обратите внимание, что вызывая функцию с различными аргументами, представленными экземплярами класса, функция использует параметр "cls" как экземпляр класса (потому что он имеет тип данных "ITest"), и может вызывать такие же методы ("Links" и «Tutorials») для каждого аргумента, так как эти методы определены в интерфейсе, поэтому они должны находиться в каждом классе, который реализует данный интерфейс, с тем же типом параметров.

— Данная технология позволяет не создавать одну и ту же функцию для каждого экземпляра.

  • Вы также можете создать дочерний интерфейс, который наследует список методов, указанных в родительском интерфейсе, добавив так же дополнительные методы при желании.

Синтаксис для определения дочернего интерфейса следующий:

public interface ChildInterface extends ParentInterface {
  // Список дополнительных методов
 }

— Интерфейс "ChildInterface" будет содержать список методов, унаследованных от интерфейса "ParentInterface", и все, что добавлено в него. Это не повлияет на интерфейс ParentInterface.

  • Интерфейс также может использоваться дочерними классами при помощи такого синтаксиса:
public ChildClass extends ParentClass implements Interface

— Класс "ChildClass" может быть расширением любого класса, не важно реализует класс "ParentClass" интерфейс или нет.

  • Класс может реализовывать несколько интерфейсов, разделенных точкой с запятой, как в этом синтаксисе:
public class ClassName implements Interface1, Interface2

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

Скачать исходники с примерами ActionScript 3 вы можете здесь.

Источник: http://coursesweb.net/actionscript/interface-class

Комментировать

Почта не публикуется.Обязательные поля отмечены *