【コラム】
Objective-Cには、ポージングという機能がある。これは、一言でいうと、既存のクラスを「乗っ取る」ことができる機能だ。すでにあるクラスを、強引に自分のクラスで置き換えてしまう。
ポージングは、poseAsClass:というメソッドで行う。このメソッドが呼ばれたクラスは、引数で渡されたクラスのように振る舞うことになる。これは、具体的な例を見てもらうのが早いだろう。
例として、Cocoaでウィンドウを表すクラスであるNSWindowを継承した、TransparentWindowというクラスを作ってみた。クラスがランタイムに読み込まれたときに呼ばれる、loadメソッドの中で、poseAsClass:を呼んでいる。
これで、TransparentWindowはNSWindowのように振る舞う。
さて、このクラスでは、alphaValueというメソッドを実装している。これはウィンドウを表示するときのアルファ値を指定するメソッドであり、1.0以下の値を返すと、半透明表示になる。つまり、アプリケーションの実行中、このウィンドウは半透明で表示される。
ところが、このウィンドウだけではない。ポージングにより、このクラスはNSWindowとして動作する。つまり、このアプリケーションのすべてのウィンドウ、システム側で用意されるものも含めて、半透明になるのだ。
次の図を見てほしい。真ん中に表示されているのがTransparentWindowだが、同時に表示しているフォントパネルやカラーパネルも半透明化されている。これらのパネルはNSWindowを継承しており、TransparentWindowのポージングの影響を受けているのだ。
|
|
すべてのウィンドウが半透明化されている |
このように強力なポージングだが、何にでも使える訳ではない。ポージングができるクラスには、制約がある。
あるクラスClassを、別のクラスPseudoClassでポージングするには、以下の条件が必要になる。
これだけの条件が揃って、ポージングが可能になる。特に、インスタンス変数の追加が行えない点は、実用上、残念ではある。
ポージングを行うと、クラス階層が変更になる。先ほどのTransparentWindowで説明しよう。
ポージングを行う前は、次のようなクラス階層になっている。NSPanelは、フォントパネルのようなフローティングウィンドウを含む、パネルを表すクラスだ。
|
これが、poseAsClass:を呼び出すと、次のように変わる。
|
%NSWindowというクラスが新しくできている。そして、NSWindowとTransparentWindowは、このクラスを継承している。
%NSWindowは、元のNSWindowと同じクラスになる。そして、この図でのNSWindowは、実はTransparentWindowをコピーしたものになっている。これにより、NSWindowへのメッセージは、TransparentWindowに送られるのと同じことになる。
つまり、ポージングは、動的なクラス階層の変化と、動的なメソッドの入れ替えによって実現されているのだ。Objective-Cの動的特性も、ここに極まれり、といった感じである。
ポージングは、ドキュメントによれば、デバッグに役に立つ、とある。だがこれは、どう考えてもハックのための機能だろう。実際、Mac OS Xでの、Cocoaベースのシステムユーティリティ系のソフトは、この機能を使い倒している。ポージングがあったからこそ、実現できている機能も多い。
だが、推測はつくだろうが、ここまで強力な機能だと、下手に使うと不安定になる。ちょっと使い方を誤ると、クラッシュしてしまう。それでもObjective-Cは、ポージングを提供する。設計の方針として、可能な限りの機能を提供しようとしていることがうかがえる。そのかわり、プログラムの安定性に責任があるのは、プログラマである。プログラミング言語ではない。
【コラム】ライトニングJava 第24回 Generic Java(5) - Genericを使ってAPIを作成する その2
【コラム】ライトニングJava 第23回 Generic Java(4) - Genericを使ってAPIを作成する その1
| 理研、脳・脊髄形成に必要な神経板湾曲の仕組みを解明 [20:16 5/25] |
| 京大、「慢性閉塞性肺疾患」患者の労作時呼吸困難は鍼治療が有効と実証 [20:08 5/25] |
| 120Hz SHVカメラ用イメージセンサーを使った撮像装置 - SHVフルスペック化へ [18:10 5/25] |
| 京大、視覚による物体認知は前頭前野からのトップダウン信号が重要と確認 [17:45 5/25] |
| 製品数の拡大だけでなくBCPの展開なども含めた総合力で事業の強化を図るTI [17:25 5/25] |
|
[9nine]制服姿見納め? セーラー服で登場も川島海荷「4人はコスプレ」 [19:15 5/27] エンタメ |
|
「NO.6」4巻は書き下ろしドラマCD付、木乃のサイン会も [18:49 5/27] ホビー |
|
[今週の新刊]マンガ大賞3回ノミネート「アイアムアヒーロー」 カープ愛「球場ラヴァーズ」も [18:33 5/27] ホビー |
|
「ゆりてつ」サイン会は作者と都電に揺られるツアー仕立て [17:45 5/27] ホビー |
|
【ネタバレもありの徹底解明コラム】『サザエさん』タマの意外な事実 [17:30 5/27] ホビー |
4つの診断で、自分の適性を見つめなおそう!
働くこと・挑戦し続けることへの思いを綴ったインタビュー
あなたにピッタリのアドバイスを読むことができます。
転職に必要な情報が収集できます
企業からアプローチのメッセージが届きます。