[前へ] [目次へ] [次へ]

インターフェイス


FGESでは特定の処理に対応することを示す型としてインターフェイスがあります。
インターフェイスにはインターフェイスメソッドのみが宣言され、
それ自体でオブジェクトを作成することはできません。

クラスがインターフェイスの実装宣言を行うと、
そのクラスのインスタンスは実装宣言しているインターフェイスに暗黙にキャストできます。
インターフェイス型からクラス型に戻す場合は明示的なキャストが必要です。

インターフェイス型の参照には名前解決およびメソッド呼び出しの演算子のみが使用できます。
ただしインターフェイスメソッドを呼び出せるのは静的解決を行う場合のみで、
動的解決を使用するとインターフェイス型であっても対象となったオブジェクトが持つ通常のクラスメンバが検索されます。

インターフェイスメソッドのうち、 optional 属性を持つインターフェイスメソッドは必須ではありません。
対象のオブジェクトが定義していないインターフェイスメソッドの名前解決は実行時例外となります。
(名前解決の時点で例外となるため、 #IsNULL など参照判定演算子による判定はできません)
対象のオブジェクトが利用したいインターフェイスメソッドを定義している保証がない場合、
インターフェイスオブジェクトの Exists メソッドを使用して実装の有無を確認することができます。

インターフェイスが持つインターフェイスメソッドの実行内容は
実装宣言した各クラスで定義する必要があります。

インターフェイスはグローバル定義空間には名前だけを宣言し、定義を後から行うことができます。
宣言だけ行われたインターフェイスは不完全型として定義され、型名としてのみ使用可能になります。
不完全型のメンバを参照することはできません。
宣言のみされたインターフェイスは同名のインターフェイスを定義することでメンバの参照が可能になります。

インターフェイスは通常インターフェイス、ネイティブインターフェイスに分けられます。
通常インターフェイスはFGESで定義するインターフェイスです。
ネイティブインターフェイスはC++レベルで定義されているインターフェイスで、
C++レベルでインターフェイス関数を持っています。
FGES上からはC++レベルのインターフェイス関数は存在を確認することさえできません。
FGES上ではネイティブインターフェイスの実装宣言はできますが、
C++レベルのインターフェイス関数を定義することができないため、
完全な定義を行うことは不可能です。
一方、ネイティブインターフェイスはFGES VMを介さずに実行できるため、
FGES上のインターフェイス呼び出しに比べ遥かに高速に実行できます。

インターフェイスの定義中、 SelfType を型名として使用すると定義中のインターフェイスを示すことができます。
ただし、これはコンパイル時に解決されるため、
クラスでインターフェイスメソッドを実装する場合は正規のインターフェイス名が必要です。

ネイティブインターフェイスの定義名は +INative で始まるため、
インターフェイスの種類はインターフェイスオブジェクトに対して GetName メソッドで定義名を取得し、
その先頭を調べることである程度確認できます。
通常インターフェイスでも INative を頭に使うことはできますが推奨されません。
また、インターフェイスの定義名の先頭は常に + が付与されます。

構文1:宣言のみを行う(定義は同じ宣言を持つ定義構文を使用します)
   interface インターフェイス名 ;

構文2:定義を行う(宣言がない場合は宣言を兼ねます)
   interface インターフェイス名 {
      定義内容
   }


●定義内容

   「定義内容」の部分はインターフェイス定義空間として扱われます。
   インターフェイス定義空間に定義できる内容は以下の通りです。
   

●デフォルト定義属性の変更

   このインターフェイス定義空間で定義するインターフェイスメソッドの
   デフォルトの定義属性を変更します。一度も設定していない場合のデフォルトは required です。
   定義属性に使用できるのは以下のいずれかです。
記述意味
required:このインターフェイスを実装するクラスはこの属性のメソッドを必ず定義しなければいけません。
optional:このインターフェイスを実装するクラスはこの属性のメソッドを定義しなくても構いません。

   例:
<  1>
<  2>
<  3>
<  4>
<  5>
<  6>
<  7>
   interface C{
      
method void A();//デフォルト(required)
   
required:
      
method void B();//required
   
optional:
      
method void C();//optional
   } 
   

●インターフェイスメソッドの宣言

   メソッド定義の構文については メソッド の項目を参照してください。

   インターフェイス定義空間に宣言されたメソッドはインターフェイスメソッドと呼びます。
   実装宣言した各クラスで定義を行うため、インターフェイス定義では宣言のみ行います。
   
   各クラスでインターフェイスメソッドを実装する場合はインターフェイス名も含めて宣言する必要があり、
   同名であってもインターフェイスが異なる場合は別のメソッドとして扱われます。
   

[前へ] [目次へ] [次へ]

最終更新 2017/04/16