From: Masao M. <mu...@hi...> - 2007-07-15 06:08:44
|
むとうです。 On Sun, 15 Jul 2007 13:28:59 +0900 (JST) Masahiro Sakai (酒井政裕) <sa...@to...> wrote: > 酒井です。 > > まぁ、キャストができるからis aか、と言われると違うと言われれば > > 違うような気もしますが、でもキャストができるんだからis aなんじゃ > > なかろうかというような気もしないでもないです。 > > 「ポインタをキャストできるならば is-a」という考えに従うならば、 > 上のコード例の AtkTextRectangle* は int* にキャストできるため > AtkTextRectangle と int が is-a の関係にあることになってしまいますよ。 ちょっと説明が足りませんでした。この場合構造体だけで考えてました。 #構造体をクラスと見立てています。 「ポインタをキャストした後の各変数に正しくアクセスができる」 という考え方ですかね。 ただ、これは一般論として言ってるわけではなく、GTKでは (たとえば、GtkWindowはGtkBinのみをPointerではなく持っていま す)、継承関係的な位置づけがあるものはそういったポリシーで定義 しているんじゃないかなと(勝手に)思っていたわけなんですが。 > > でも、逆に、なんでここって、 > > > > typedef struct _AtkTextRange { > > AtkTextRectangle* bounds; /* これ */ > > int start_offset; > > } AtkTextRange; > > > > じゃないんですかね。これだったらis aの関係ではないと > > 私もわかるんですけど・・・。 > > Pointerにしなかったのは単にメモリ管理が楽だから? > > メモリ管理といよりは、int等と同じように単なる値として扱いたいということ > だと思いますが。 初心者みたいな質問して申し訳ないんですが(苦笑) 値として扱いたい場合とポインタとして扱いたい場合の違いって 何でしょうか。 それからさかいさんがis-aではないと思った理由って具体的には なんでしょうか。 rectangleを拡張したのがrangeと考えるのか、rangeはrectangleを持つ と考えたかの違いだとは思うんですけど・・・。 この辺が客観的なものとして明らかにできれば、今後の実装の参考に できるのではないかと思います。 #前述したとおり、GTKの場合、私は単にポインタで他の構造体を #持っていればそれはhas-a、そうじゃなければis-aくらいに考えてました。 -- .:% Masao Mutoh<mu...@hi...> |