SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Cでわかるオブジェクト指向

【第5回】委譲


Cによる委譲の実現(2)

 これで、サービスステータスは一通り完成しました。

 次に、このServiceStatusクラスを使ってMemberクラスを拡張していきます。

リスト:4 Member.h 変更箇所(太字部分:追加・変更箇所)
...
/* Memberクラスの構造定義 */
#define INTERFACE_OF_MEMBER ¥
    INTERFACE_OF_USER              /* Userクラス構造定義の継承 */¥
    void* member_private_data;     /* カプセル化データ */¥
    int (*changeServiceStautsTo)(Member *self, char* new_staus); 
...

Member* Member_new(int id, char* name, char* status);
/* Memberオブジェクト生成 */
...
リスト5:Member.private.h 変更箇所(太字部分:追加・変更箇所)
#include "User.private.h"   /* Userクラスカプセル化領域の継承 */
#include "ServiceStatus.h" 

/* Memberクラス属性定義 */
struct _member_attribute {
    char* name;
    ServiceStatus* service_status;
};               

...

/* 初期化・終了処理 */
Member* Member_initialize(Member* self, int id, char* name, char* status);
void Member_finalize(Member* self);
リスト6:Member.c 変更箇所(太字部分:追加・変更箇所)
...
/* サービスステータス変更 */
static int Member_changeServiceStautsTo(Member *self, char* new_staus)
{
MEMBER_ATTRIBUTE(self)->service_status->changeServiceStautsTo(
MEMBER_ATTRIBUTE(self)->service_status,
new_staus
);
return 1;
}
/* Memberオブジェクト初期化処理 */ Member* Member_initialize(Member* self, int id, char* name, char* status) { User_initialize((User*)self, id); self->member_private_data = malloc(sizeof(struct _member_attribute)); MEMBER_ATTRIBUTE(self)->name = name; MEMBER_ATTRIBUTE(self)->service_status = ServiceStatus_new(status); self->action = Member_action; self->changeServiceStautsTo = Member_changeServiceStautsTo; return self; } /* Memberオブジェクト終了処理 */ void Member_finalize(Member* self) { ServiceStatus_delete(MEMBER_ATTRIBUTE(self)->service_status); free(MEMBER_ATTRIBUTE(self)); /* 属性構造体の解放 */ User_finalize((User*)self); /* 継承領域の終了処理 */ } /* Memberオブジェクト生成 */ Member* Member_new(int id, char* name, char* status) { Member* obj = (Member*)malloc(sizeof(Member)); return Member_initialize(obj, id, name, status); } ...

次のページ
委譲の実行サンプル

この記事は参考になりましたか?

Cでわかるオブジェクト指向連載記事一覧

もっと読む

この記事の著者

島田 浩二(Ruby札幌)(シマダ コウジ)

1978年生まれ。電気通信大学電気通信学部情報工学科卒業後、メーカ系ソフトウェア会社にて携帯電話の開発業務に従事した後、2006年より札幌にてフリーのプログラマとして活動。2009年7月に株式会社えにしテックを設立し、同社代表取締役に就任。 日本Rubyの会理事、一般社団法人LOCAL理事、Ruby札幌主宰。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/3710 2009/03/17 13:14

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー