UDN
Search public documentation:

UnrealScriptInterfacesCH
English Translation
日本語訳
한국어

Interested in the Unreal Engine?
Visit the Unreal Technology site.

Looking for jobs and company info?
Check out the Epic games site.

Questions about support via UDN?
Contact the UDN Staff

UE3 主页 > UnrealScript > UnrealScript 接口

UnrealScript 接口


概述


UnrealEngine3(虚幻引擎 3)的 UnrealScript 支持接口类。与大多数 UnrealScript 一样,虚幻引擎 3 的这个接口实现大部分效仿了 Java 实现。

和其它编程语言的接口一样,接口中只能有函数声明不能有函数体。这些声明的方法的实现必须在实际实现这个接口的类中完成。它允许所有的函数类型 – 正常的函数及事件。设置可以在接口中定义代理(尽管对此有限制,关于限制的详细信息请参见 Limitations(限制)章节)。

接口仅能包含不影响类的内存布局的声明 – 可以声明枚举值、结构体和常量,但是不能声明变量。

创建接口


声明接口的语法如下所示(方括号中的部分是可选的):

     interface InterfaceName [extends ParentInterface] [classSpecifiers];
  
     // 接口主体
  

并且,接口可以选择扩展另一个接口。 如果没有指定基类接口,隐含着它是从 Core.Interface 继承而来的。

同时,也可以使用某些类修饰符。以下类修饰符对于接口来说也是有效的:

native
这将会使得接口是 natived 的,将会创建一个 C++ 接口声明。声明为 Native 的接口仅可以通过 native 类来实现。Native 类的其它限制对于 native 接口也是有效的。可以通过在文件名的后面附加‘native’关键字来使得这个文件用于导出 native 声明。例如, native(MyInterface) 。使用名称 =inherit = 将会从父项的接口中继承文件名。
dependson(Class)
没有添加任何功能,它仅用于提示编译器。

接口体也可以包含 cpptext 块。它将会同 native 接口声明一同被导出。

实现接口


实现接口的工作方式和 Java 中类似:

     class MyClass extends Object implements(InterfaceName)
  

这个类将也将必须声明接口中声明的所有函数。除 native 关键字外,类中的函数声明必须和接口中的声明相匹配。 接口中声明为 native 的函数在实现该接口的类中不必声明为 native,反之亦然。

通过使用以下语法,一个类可以实现多个接口:

     class MyClass extends Object implements(FirstInterface, SecondInterface)
  

使用接口


使用接口的工作方式和使用其它的类的方式一样。

     var InterfaceName InterfaceReference;
  
     function DoSomething()
     {
        InterfaceReference.callInterfaceFunction();
     }
  
     function DoSomethingElse(Object anObject)
     {
        if (InterfaceReference(anObject) != none)
        {
           // ...
        }
     }
  

在 C++ 中,一个 native 接口变量可以使用 TScriptInterface 表示,在 UnTemplate.h 中进行声明。 这个结构体存储了到同一个对象的两个指针 - UObject 指针和接口类型的指针。

UObject 函数 GetInterfaceAddress 可以用于检查 UObject 实例是否实现了特定的接口,如果它实现了,那么将会获得到该接口的指针。 例如,

  UObject* pObj;
  IInterfaceName* Interface = (IInterfaceName*)pObj->GetInterfaceAddress(IInterfaceName::UClassType::StaticClass());
  // (if pObj does not implement IInterfaceName, Interface will be NULL.(如果 pObj 没有实现 IInterfaceName,那么接口将是 NULL。)
  
  

限制


  • Native 接口(使用 native 关键字声明的接口)仅能由 native 类来实现。
  • 不支持实现具有同一个基类的多个接口,如果这样做,则会导致不正确的 vtable 偏移。由于这个原因,所以我们推荐您使用平行的层次来组织您的接口类,而不是使用类继承的方式来组织它或对其进行逻辑分组。
  • 虽然代理可以在接口中定义,但是不可以通过接口引用调用它们或者为它们分配新的值;您必须换成对实现这个接口的对象进行处理。