菱形継承…

http://d.hatena.ne.jp/ytakenaka/20070623/p1

なるほど。データ(スロット)とメソッド共有のためだけの継承というわけですか…
理解に手こずったのはpnm-header/pnm-dataとpnm-data-infoはis_a関係なの!?ってところでした。
Ruby脳なので継承はis_a関係でないとだめという意識がありました。だからあまり継承は多用しません。Rubyならばpnm-data-infoもpnm-headerもpnm-dataもみなモジュールですね。これらのクラス自身がインスタンスを作っていませんので。これをクラスにmix-inすることで簡易多重継承します。
mix-inみたいなものだと考えるとすっきりしました。

CLOSだと各々のクラスが独自に継承グラフを持つことで多重継承の混乱を抑えているのでしょうね。だから怖がらずに継承をガシガシ使えるのでしょう。

試しにRubyに翻訳しようとしていますが、どうも (setf (ldb (byte 8 p) (aref data x y)) v) が理解できずに難儀しています。HyperSpecなりいろんなサイトなりみてまわっているのですが、Cの演算子を使った数式で表現するとどうなるのでしょうか。ビット演算はフラグ操作くらいしか使ったことないんですよ。

詳しい説明のおかげでCLOSの菱形継承で少なくとも背筋が凍り付くようなことはなくなりました(笑)