クラスの使い方
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なメソッドなどにアクセスするコードを書いてもコンパイルが通ってしまい、実行時にエラーとなりました。まだ、開発中なので単なる不具合かも知れませんが・・・