Cによる委譲の実現(2)
これで、サービスステータスは一通り完成しました。
次に、このServiceStatusクラスを使ってMemberクラスを拡張していきます。
...
/* 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オブジェクト生成 */
...
#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);
... /* サービスステータス変更 */ 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); } ...
