公開技術情報

[English] [Japanese]

17. インタフェース 編

LuneScript は、クラスの多重継承をサポートしない代わりに、 インタフェースをサポートします。

インタフェース

Java や C# を使用していればお馴染だと思いますが、 インタフェースは機能が制限されたクラスと考えて問題ないです。

具体的には、インタフェースは、クラスと次の違いがあります。

  • 宣言は class ではなく interface。
  • メンバが持てない。
  • メソッドは全て abstract。 よってインタフェース単体ではインスタンスを生成できない。
  • インタフェースを実装するクラスは、extend に () を付ける
  • クラスは複数のインタフェースを実装できる
  • イタフェースを実装するクラスのメソッドには override を付けない。

次にインタフェースの例を示します。

// @lnsFront: ok
interface IF {
   pub fn func();
}
class Test extend (IF) {
   pub fn func() {
      print( __func__ );
   }
}
fn sub( obj:IF ) {
   obj.func();
}
sub( new Test() ); // Test.func

この例では、インタフェース IF を定義しています。

次に 2 つのインタフェースを実装するクラスの例を示します。

// @lnsFront: ok
interface IF1 {
   pub fn func1();
}
interface IF2 {
   pub fn func2();
}
class Test extend (IF1,IF2) {
   pub fn func1() {
      print( __func__ );
   }
   pub fn func2() {
      print( __func__ );
   }
}
fn sub( obj1:IF1, obj2:IF2 ) {
   obj1.func1();
   obj2.func2();
}
let mut test = new Test();
sub( test, test ); // Test.func Test.func2

複数のインタフェースを実装する場合、 extend の後に () の中に続けて宣言します。

ちなみに、複数のインタフェースを実装する場合の制限として、 次のように実装するインタフェース内に、 同名で異なる型のメソッドがある場合、エラーとなります。

// @lnsFront: error
interface IF1 {
   pub fn func():int;
}
interface IF2 {
   pub fn func():str;
}
class Test extend (IF1,IF2) { // mismatch IF1.func, IF2.func
}

なお、現在のインタフェースの仕様として、メソッドのデフォルト処理はサポートしていません。

まとめ

LuneScript は、クラスの多重継承をサポートしない代わりに、 インタフェースをサポートします。

次回は、Mapping について説明します。