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 について説明します。