UDN
Search public documentation:

UnrealScriptInterfacesJP
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 の UnrealScript は、多くの UnrealScript と同様に、インターフェース実装の面においても多くの Java 実装と非常に類似しています。

他のプログラミング用語のインターフェースと同様に、そのインターフェースは関数の実態を含まず宣言のみで構成されます。 宣言されたこれらのメソッドは、インターフェースを実際に実装するクラス内で実装しなければなりません。すべての関数のタイプは allow で、normal 関数でありながらイベントでもあり、 デリゲート の定義もインターフェースで行えます。

インターフェースには、クラスのメモリレイアウトに影響を及ぼさない宣言のみ格納できます。enum、struct および consts は宣言できますが、変数は宣言できません。

インターフェースの作成


インターフェースクラスの宣言構文は次のとおりです (角カッコで囲まれた部分はオプションです)。

     interface InterfaceName [extends ParentInterface] [classSpecifiers];
  
     // interface body
  

そして、オプションでインターフェースに拡張インターフェースを持たせることも可能です。ベースインターフェースを指定しない場合、Core.Interface から暗黙的に継承します。

また、クラス指定子も利用できます。以下に示すものは、インターフェースに有効なクラス指定子です。

native
これはインターフェースをネイティブにする働きを持ち、C++ インターフェースの宣言を作成します。Native 型で宣言されたインターフェースは、native クラスによる実行のみ可能です。ネイティブ クラスに関するその他の制限も、ネイティブ インターフェースと同じです。ネイティブ キーワードには、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 で宣言します。この struct は、同じオブジェクトへの 2 つのポインター (UObject ポインタとインターフェースタイプのポインタ) を格納します。

UObject 関数 GetInterfaceAddress を使用して、UObject インスタンスが特定のインターフェースを実装するかどうかを調べ、実装する場合はそのポインタを取得します。以下に例を示します。

  UObject* pObj;
  IInterfaceName* Interface = (IInterfaceName*)pObj->GetInterfaceAddress(IInterfaceName::UClassType::StaticClass());
  // (if pObj が IInterfaceName を実装しない場合、Interface は NULL)
  
  

制限事項


  • Native インターフェース (native キーワードを使って宣言されたインターフェースクラス) は native クラスのみで実装できます。
  • 共通のベースクラスを持つ複数のインターフェースクラスの実装はサポートされていません。実装を試みると不正な vtable オフセットが生じる可能性があります。そのため、クラスの継承関係を使って論理グループを形成するより、インターフェースクラスをフラットな階層にまとめる方法が推奨されています。
  • デリゲートは、インターフェイスで定義することができますが、インターフェイスの参照を通じて、呼び出したり、新たな値を割り当てたりすることはできません。その場合、インターフェイスを実装しているオブジェクトにキャストする必要があります。