派生クラス
次は、派生クラスとなる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); }