派生クラス
次は、派生クラスとなるSubObjectClassです。ObjectClassを継承したSubObjectClassは、以下のようになりました。
まずは、クラス定義です。構造定義において親クラスとするObjectClassの構造を受け継ぐようにしています。基本的な構造は、ObjectClassと大きく違いはありません。
#ifndef _SUBOBJECTCLASS_H_INCLUDE_
#define _SUBOBJECTCLASS_H_INCLUDE_
#include "ObjectClass.h" /* ObjectClassの継承 */
/* SubObjectClassの構造定義 */
#define INTERFACE_OF_SUBOBJECT_CLASS \
INTERFACE_OF_OBJECT_CLASS /* ObjectClass構造定義の継承 */\
void* subobject_private_data; /* カプセル化データ */\
int (*message2)(SubObjectClass* self); /* メッセージ */
/* SubObjectClassクラス定義 */
typedef struct _subobject SubObjectClass;
struct _subobject{
INTERFACE_OF_SUBOBJECT_CLASS
};
/* サブオブジェクト生成メソッド */
SubObjectClass *SubObject_new(char *name, int status, int type);
/* サブオブジェクト破棄メソッド */
void SubObject_delete(SubObjectClass *obj);
#endif
次は、カプセル化された領域を定義しているSubObjectClass.private.hです。構造において、ObjectClassとの違いはありません。
#include "ObjectClass.private.h" /* ObjectClassカプセル化領域の継承 */
/* SubObjectClass属性定義 */
struct _subobjectclass_attribute {
int type;
};
/* SubObjectClass属性アクセス用マクロ */
#define SUBOBJECTCLASS_ATTRIBUTE(ptr)\
((struct _subobjectclass_attribute*)(ptr->subobject_private_data))
/* 初期化・終了処理 */
SubObjectClass* SubObject_initialize(SubObjectClass* self, char* name, int status, int type);
void SubObject_finalize(SubObjectClass* self);
最後に、SubObjectClass固有の部分の実装を行うSubObjectClass.cです。
#include "SubObjectClass.h"
#include "SubObjectClass.private.h"
#include <stdio.h>
#include <stdlib.h>
/* メソッドの実装 */
static int SubObject_method2(SubObjectClass* self)
{
printf("%s.type = %d\n",
OBJECTCLASS_ATTRIBUTE((ObjectClass*)self)->name,
SUBOBJECTCLASS_ATTRIBUTE(self)->type);
return 1;
}
/* サブオブジェクト初期化メソッド */
SubObjectClass* SubObject_initialize(SubObjectClass* self, char* name, int status, int type)
{
/* 親クラスから引き継いだ領域の初期化 */
Object_initialize((ObjectClass*)self, name, status);
/* 属性構造体を生成し、属性を初期化 */
self->subobject_private_data = malloc(sizeof(struct _subobjectclass_attribute));
SUBOBJECTCLASS_ATTRIBUTE(self)->type = type;
self->message2 = SubObject_method2;
return self;
}
/* サブオブジェクト終了処理メソッド */
void SubObject_finalize(SubObjectClass* self)
{
/* 属性構造体の解放 */
free(SUBOBJECTCLASS_ATTRIBUTE(self));
/* 親クラスから引き継いだ領域の終了処理 */
Object_finalize((ObjectClass*)self);
}
/* サブオブジェクト生成メソッド */
SubObjectClass* SubObject_new(char *name, int status, int type)
{
SubObjectClass* obj = (SubObjectClass*)malloc(sizeof(SubObjectClass));
return SubObject_initialize(obj, name, status, type);
}
/* サブオブジェクト破棄メソッド */
void SubObject_delete(SubObjectClass* obj)
{
SubObject_finalize(obj);
free(obj);
}
