公開技術情報

[English] [Japanese]

15. クラス advertise 編

LuneScript は、クラスが保持するメンバのメソッドに対して、 透過的にアクセスさせることが出来ます。

advertise

「透過的にアクセス」という表現では伝わり難いと思うので、次の例で説明します。

// @lnsFront: ok
abstract class Test {
   pub abstract fn foo(): str;
   pub abstract fn bar(): str;
}
class TestSub1 extend Test {
   pub override fn foo(): str {
      return "foo";
   }
   pub override fn bar(): str {
      return "bar";
   }
}
class TestSub2 extend Test {
   pri let sub:TestSub1;
   advertise sub;
   pub override fn bar(): str {
      return "hoge" .. self.sub.bar();
   }
}
fn func( test:Test ){
   print( test.foo(), test.bar() );
}
func( new TestSub1() ); // foo, bar
func( new TestSub2( new TestSub1() ) ); // foo, hogebar

TestSub2 は、 メンバ sub を advertise しています。

これにより TestSub2 は、 次のようにメンバ sub のメソッド (foo,bar) をコールする処理を内部的に生成します。

// @lnsFront: skip
pub override fn TestSub2.foo(): str {
   return self.sub.foo();
}
pub override fn TestSub2.bar(): str {
   return self.sub.bar();
}

この例の TestSub2 では、メソッド bar() を宣言しています。

このように宣言したメソッドと、advertise で生成されるメソッドが同名の場合、 宣言したメソッドが優先されます。

注意

複数のメンバを advertise した時、 そのメンバ間で同名のメソッドがある場合の動作は 未定義 です。

まとめ

  • advertise 宣言することで、メンバのメソッドを透過的にアクセスさせることが出来る
  • 複数のメンバを advertise する場合は注意が必要

次回は、インタフェースについて説明します。