どうやらObjective-Cの「カテゴリ」と呼ばれる機能が、 以前から悩んでいたselector namespaceに近いもののようだ。 基本的な概念は理解できるものの、実際の挙動(と実装)がイメージできず苦しんでいたので、 参考にできるものがあるのはありがたい。
しかし、ちょっとGoogleしてみた範囲内では、その仕様はよくわからなかった。 具体的な挙動や実装について参考になる資料はないものだろうか。
あれ? まてよ。
今、改めてGoogleしたページを読み返すと、別に有効範囲が静的スコープであるとは書いてないな。 そうするともしかしてカテゴリってのは、ただ単に「インスタンス変数が追加できないMix-in」なのか。 それだったらすっごい残念なのだが。
selector namespaceのある言語といえば、他にSmallscript (S#)やJavaScript (EcmaScript 4.0)などもあるが、 いずれも現時点で私には理解できていない。
情報提供歓迎。
知人のお母さんが亡くなった、ということで、教会でのお葬式(偲ぶ会)に参加する。
私は故人とは面識はないが、人々に愛されていたことがよく分かる会であった。 簡素ながらも思いやりが感じられる良い会であったと思う。
父と同じ68歳。早すぎる死という印象もないではない。 彼女の霊が安からんことを。
カテゴリの特徴はこんな感じです。
・インスタンス変数は追加できない
・スーパークラスのメソッドでも実行時にオーバーライドできてサブクラスはそれに従う
なのでインスタンス側にメソッドが属してるわけじゃない。例えばルートクラスのhashとかをいじると、サブクラスでオーバーライドがなければ全部それになる。
・カテゴリ名の衝突はソースレベルでしか回避できない
・元のメソッドを参照する方法は(なんらかの形で関数ポインタを保持とかしない限り)ない
・カテゴリがロードされるときはカテゴリ内の+loadが呼ばれる
機能的にはクラス階層の根っこの方に無理やりパッチを当てたりできますが、大体はインターフェースを分類して機能単位で整理する場合がほとんどです(一応Cなのでプロトタイプがないとうるさいし、構造体はオブジェクトじゃないから明示しないとダメ)。いわゆるプロトコルとかインターフェースと違って実装必須要求をださないのでオプショナルなプロトコル定義にも使います。
情報ありがとうございます。
やっぱりselector namespaceとは違うもののようですね。残念。
しかし、参考にはなりました。