クラスの使い方

BooのクラスはPythonよりもC#に近いです。

class Foo:
  // フィールドのデフォルトはprivate
  field1 = "field1"

  // プロパティのデフォルトはpublic
  Field1:
    get:
      return field1
    set:
      field1 = value

  // 属性によるプロパティ
  [property(Field2)]
  field2 = "field2"

  // getterのみ指定
  [getter(Field3)]
  field3 = "field3"
  
  // スタティックコンストラクタは引数を取れない
  static def constructor():
    print "static constructor"
  
  // コンストラクタはconstructorで固定
  def constructor():
    print "constructor"

  // メソッドのデフォルトはpublic
  def method1():
    print "method1"
  
  public def method2():
    print "method2"

  protected def method3():
    print "method3"
  
  private def method4():
    print "method4"
  
  internal def method5():
    print "method5"

  virtual def method6():
    print "method6"

  // イベント(引数にstringを取る)
  event handler as callable(string)


// Fooから継承
class Bar(Foo):
  // 非仮想関数を隠す
  def method2():
    print "Bar#method2"
  // オーバーライド
  // overrideの有無に左右されない不具合def method6():
    print "Bar#method6"

// Barから継承これ以上の継承を禁止C#のsealedと同じ
final class Baz(Bar):
  pass

// handlerに渡す関数
def func1(msg):
  print "+", msg, "+"

// インスタンスの生成
baz = Baz()
baz.method2()
baz.method6()

// プロパティへ代入
baz.Field1 = "1"
baz.Field2 = "2"
print baz.Field1, baz.Field2

// ベースクラスへ代入
foo as Foo = baz
// ベースクラスのmethod2が呼ばれる
foo.method2()
// オーバーライドしたmethod6が呼ばれる
foo.method6()

// ハンドラに関数を登録
baz.handler += func1
// ハンドラにクロージャ(中括弧)を登録
baz.handler += { msg | print "#", msg, "#" }
// ハンドラにクロージャ(ブロック)を登録
baz.handler += def (msg):
  print "*", msg, "*"
// イベント発火
baz.handler("hello")

/* 結果
 static constructor
 constructor
 Bar#method2
 Bar#method6
 1 2
 method2
 Bar#method6
 + hello +
 # hello #
 * hello *
 */

C#を知っていればすぐ分かりますね。1つ気になったのが、protectedやprivateなメソッドなどにアクセスするコードを書いてもコンパイルが通ってしまい、実行時にエラーとなりました。まだ、開発中なので単なる不具合かも知れませんが・・・