From: Masahiro S. ()
<sa...@to...> - 2007-07-15 04:29:38
|
酒井です。 From: Masao Mutoh <mu...@hi...> Date: Sun, 15 Jul 2007 12:04:31 +0900 > むとうです。 > > On Sun, 15 Jul 2007 00:45:00 +0900 (JST) > Masahiro Sakai (酒井政裕) <sa...@to...> wrote: > > > 酒井です。 > > > > 現在、Atk::TextRange は ATk::TextRectangle のサブクラスとして実装されて > > いますが、この両者が is a の関係とは思えないので、これは変ではないでしょ > > うか? > > うーん。 > たぶん、以下のコードをイメージしてRangeはRectangleとis aの関係だと > 思って実装したんじゃないかと思います。 > > ---- > #include <stdio.h> > #include <stdlib.h> > > typedef struct _AtkTextRectangle { > int x; > } AtkTextRectangle; > > typedef struct _AtkTextRange { > AtkTextRectangle bounds; > int start_offset; > } AtkTextRange; > > int > main(int argc, char *argv[]) > { > AtkTextRange *a = malloc(sizeof(AtkTextRange)); > a->start_offset = 1; > ((AtkTextRectangle*)a)->x = 5; /* このキャストができる。*/ > > printf("start_offset = %d\n", a->start_offset); > printf("x = %d\n", ((AtkTextRectangle*)a)->x); /* このキャストができる。*/ > } > ---- > > まぁ、キャストができるからis aか、と言われると違うと言われれば > 違うような気もしますが、でもキャストができるんだからis aなんじゃ > なかろうかというような気もしないでもないです。 「ポインタをキャストできるならば is-a」という考えに従うならば、 上のコード例の AtkTextRectangle* は int* にキャストできるため AtkTextRectangle と int が is-a の関係にあることになってしまいますよ。 > でも、逆に、なんでここって、 > > typedef struct _AtkTextRange { > AtkTextRectangle* bounds; /* これ */ > int start_offset; > } AtkTextRange; > > じゃないんですかね。これだったらis aの関係ではないと > 私もわかるんですけど・・・。 > Pointerにしなかったのは単にメモリ管理が楽だから? メモリ管理といよりは、int等と同じように単なる値として扱いたいということ だと思いますが。 -- 酒井 政裕 / Masahiro Sakai |