Next: 各クラスの概要
Up: Cによるオブジェクト指向の記述
Previous: クラスの定義
Subsections
C言語はオブジェクト指向言語として設計されていないため、言語の機能として
継承やカプセル化の機構を持たない。そこで、利用する側からの工夫や、
オブジェクト指向的にクラスを利用するためのルールを制定することで、
メンテナンス性の高いコードの維持に努めるようにする。
C言語による簡易なオブジェクト指向記述においては、各クラスのメンバ
変数のアクセスコントロールを実現することはできない。したがって、
言語のセマンティクスによれば各クラスのメンバ変数は全て公開メンバである。
上記のC言語の制約を逃れ、少なくともある程度のアクセスコントロールを
意図するためにも、メンバ変数への直接のアクセスは可能な限り避け、
公開メンバ変数に対してのみアクセサを用意することを心掛けることが
望ましい。
例えば、MalibRingBuf クラスは、親クラス MalibBuffer の
さらに親クラスである MalibHolder の定義する
メンバ変数 size を持つ。ある MalibRingBuf のインスタンス
rbuf からその size へアクセスする方法には、
次の二通りのパターンがある。
MalibRingBuf* rbuf;
gint size;
/* pattern 1 */
size = rbuf->super.super.size;
/* pattern 2 */
size = ((MalibHolder*)rbuf)->size;
本ライブラリの実装においては、
メンバ変数 size が MalibHolder で定義されていることが
明示的に分かるとの利点を重視し、後者の方法による記述を採用
する。
それぞれのメンバ関数の呼び出しにおいては、定義の項で述べたとおり、
第一引数にはそのメンバ関数を持つクラスのオブジェクト(正確には
そのオブジェクトへのポインタ)を置く。その際、オブジェクト指向言語では
ないため暗黙の型変換は行なわれない。したがって利用者は、
呼び出そうとする関数がたとえ上位クラスで定義されているメンバ関数であり
そのオブジェクトのクラスが継承して持っているはずのメンバ関数であったと
しても、明示的な型変換を介して関数に渡す必要がある。
明示的な型変換の必要性は、バーチャル関数に関しても同様である。
また Java などと違い動的な型変換のチェック機構は持たない。したがって、
コンパイル時の警告を抑えるためだけを目的とした、
十分なデータ型の検証を行なわない不用意な型変換を記述してはならない。
Jun IIO
2001-06-14