SHOEISHA iD

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

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

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

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

【第2回】カプセル化


 すべての変更を施した後のObjectClass.cの全体を以下に示します。

< リスト6 >  ObjectClass.cの変更(全体)
#include "ObjectClass.h"
#include <stdio.h>
#include <stdlib.h>


/* ObjectClass属性定義 */
struct _objectclass_attribute {
  char* name;
  int status;
};                   
/* ObjectClass属性アクセス用マクロ */
#define OBJECT_CLASS_ATTRIBUTE(ptr)((struct _objectclass_attribute*)(ptr->encapsulation_data))


/* メソッドの実装 */
static int Object_method(Instance* self)
{
  printf("%s.status = %d\n", 
         OBJECT_CLASS_ATTRIBUTE(self)->name, 
         OBJECT_CLASS_ATTRIBUTE(self)->status);
  return 1;
}


/* オブジェクト生成メソッド */
Instance* Object_new(char* name, int status)
{
  Instance* obj = (Instance*)malloc(sizeof(Instance));

  /* 属性構造体を生成し、属性を初期化 */
  obj->encapsulation_data = malloc(sizeof(struct _objectclass_attribute));
  OBJECT_CLASS_ATTRIBUTE(obj)->name = name;
  OBJECT_CLASS_ATTRIBUTE(obj)->status = status;

  obj->message = Object_method;

  return obj;
}

/* オブジェクト破棄メソッド */
void Object_delete(Instance* obj)
{
  free(OBJECT_CLASS_ATTRIBUTE(obj));  /* 属性構造体の解放 */ 
  free(obj);    /* オブジェクト自身の解放 */
}

 これで、カプセル化の実現は無事終了です。オブジェクトの外部から属性を隠ぺいしつつ、オブジェクト内部からは今までどおり属性にアクセスできるようになり、前回のコードの問題点を解決することができました。いかがでしょうか。

 「処理とデータの関連を明示的に示してプログラムを安全に扱う」ことが、OOPの目的と聞くと、前回のようなプログラムでも問題がないように見えるかもしれません。しかし、「データにアクセスすることのできる処理を限定的にする」ことが出来ていなければ、それは十分な実現とは言えません。OOPにおいて重要なのは「データにアクセスすることのできる処理を限定的にする」ことであり、それを説明する概念が「カプセル化」です。

まとめ

 今回はOOPの基本であるカプセル化という概念について、C言語を用いた実装例とともに解説しました。次回はいよいよ継承の解説に入って行こうと思います。

 本稿が、少しでも皆さんのオブジェクト指向の理解に貢献できたのなら幸いです。次回もお楽しみに。

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

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
Cでわかるオブジェクト指向連載記事一覧

もっと読む

この記事の著者

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

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

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

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

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/3707 2009/03/17 12:59

イベント

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

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

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

メールバックナンバー