« alloc/init まわりの修正の新しいパッチ | トップページ | 今日の SourceForge.net »

2006.05.19

メモ: RubyCocoa でのカテゴリやプロトコルのとりまわし

rubycocoa-talk への返答を書いている間に思いついたことのメモ。

ML に投げたように、addRubyMethod:withType: を利用すれば解決可能な問題ではあるけれど、

  • メソッドひとつずつについて書く必要がある
  • 型情報を自分でつくらないといけない

というあたりがコード書く際のネックになりそう。メソッド名や型情報をまちがえたらアウトなのだ。そういうのはニンゲンには向いていない。

Objectice-C のランタイムは、カテゴリや非定型プロトコルとして、セレクタや型の情報を持っているのだから、それを利用すれば簡単に処理できるんじゃないかと考えた。

こんなでどうだろう?

  • プロトコルおよびカテゴリのクラスをつくる OSX::OCProtocol, OSX::OCCategory
  • 個々のプロトコルやカテゴリは上記クラスのインスタンス
  • これらを DummyProtocolHandler やカスタムクラスの型情報として登録できる

雰囲気としてこんな動作かな。メソッド名はてきとう。

 OSX::OCProtocol.import :SomeProtocol # => define OSX::OCProtocol::SomeProtocol
 
 class MyClass < OSX::NSObject
   
   ns_confirm OSX::OCProtocol::SomeProtocol # allow informal protocol
   
   # automatically invoke addRubyMethod:withType: via method_added
   # when the name of method matches any method of the protocol 
   def sel_msg(a, b)
   end
   
 end
 cat_delegate = SomeClass.category[catname]
 OSX.ns_handle_signature(cat_delegate) # add selector/signature to DummyProtocolHandler

後者についても、本来なら NSObject クラスに ns_confirm すれば意味的には同じになるはずなんだけど、現在の RubyCocoa の実装では継承関係がないから、そうもいかず。

考えてみると、セレクタと型情報しか持たないなら、ただの Hash でもよさそう。登録操作に与えるものとして Hash を使ってもいいかも。もし実装されるとしてもだいぶ先だけどね。

|

« alloc/init まわりの修正の新しいパッチ | トップページ | 今日の SourceForge.net »