Войти
UDKСтатьи

Интерфейсы UnrealScript

Автор:

Введение
Обзор
  Создание интерфейсов
  Реализация интерфейсов
  Применение интерфейсов
Ограничения

Введение

Язык UnrealScript движка Unreal Engine 3 поддерживает интерфейсы. Как и большая часть языка UnrealScript, реализация интерфейсов UnrealScript напоминает реализацию интерфейсов Java.

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

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

Обзор

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

Синтаксис объявления интерфейса выглядит следующим образом (части в квадратных скобках являются необязательными):

   interface InterfaceName [extends ParentInterface] [classSpecifiers];

   // interface body

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

Кроме того, для интерфейсов могут быть использованы следующие спецификаторы классов:

native
Предназначен для создания встроенного (native) интерфейса, генерируется объявление для интерфейса в заголовочном файле C++. Встроенные интерфейсы могут быть реализованы только встроенными классами. Ограничения для встроенных классов применимы и к встроенным интерфейсам. Спецификатор `native` позволяет указать имя файла для экспорта объявления в заголовочный файл, например, native(MyInterface). Указание имени inherit позволяет унаследовать имя файла базового интерфейса.
dependson(Class)
Этот спецификатор не имеет функциональности, а является намеком для компилятора.

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

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

Реализация интерфейсов осуществляется так же, как и в Java:

   class MyClass extends Object implements(InterfaceName)

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

Класс может реализовать несколько интерфейсов с использованием следующего синтаксиса:

   class MyClass extends Object implements(FirstInterface, SecondInterface)

Применение интерфейсов

Интерфейсы применяются точно также, как и классы:

   var InterfaceName InterfaceReference;

   function DoSomething()
   {
      InterfaceReference.callInterfaceFunction();
   }

   function DoSomethingElse(Object anObject)
   {
      if (InterfaceReference(anObject) != none)
      {
         // ...
      }
   }

В коде на C++ переменная встроенного интерфейса представлена в виде структуры TScriptInterface, объявленной в UnTemplate.h. Эта структура хранит два указателя на объект - указатель UObject и указатель с типом интерфейса.

Функция GetInterfaceAddress класса UObject может быть использована для получения ссылки на UObject для проверки наличия экземпляра определенного интерфейса. Например:

UObject* pObj;
IInterfaceName* Interface = (IInterfaceName*)pObj->GetInterfaceAddress(IInterfaceName::UClassType::StaticClass());
// (if pObj does not implement IInterfaceName, Interface will be NULL.)

Ограничения

Данный документ является переводом оригинального документа UnrealScript Interfaces.

#UDK, #Unreal Development Kit

7 июня 2012