メモ: 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 を使ってもいいかも。もし実装されるとしてもだいぶ先だけどね。
| 固定リンク
最近のコメント