SHOEISHA iD

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

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

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

【第3回】継承


  • X ポスト
  • このエントリーをはてなブックマークに追加

派生クラス

 次は、派生クラスとなるSubObjectClassです。ObjectClassを継承したSubObjectClassは、以下のようになりました。

 まずは、クラス定義です。構造定義において親クラスとするObjectClassの構造を受け継ぐようにしています。基本的な構造は、ObjectClassと大きく違いはありません。

リスト12:SubObjectClass.h
#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との違いはありません。

リスト13:SubObjectClass.private.h
#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です。

リスト14: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);
}

次のページ
継承の実行サンプル

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

  • X ポスト
  • このエントリーをはてなブックマークに追加
Cでわかるオブジェクト指向連載記事一覧

もっと読む

この記事の著者

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

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

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

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

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/3708 2009/03/17 13:04

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング