[予1] オブジェクト指向って何だ?
〔この節はオブジェクト指向言語未経験の方向けです。〕
オブジェクト指向プログラミングについて、Wikipediaを引用して概略を説明します。
要するに、「オブジェクト」を集めてプログラムを書いていく手法なのです。「オブジェクト」とは何かですが、これはいろいろあります。例えばRPGなんかで考えますと、主人公や町の人々、宝箱の入ったアイテム、建物… これらはすべてオブジェクトとして表現することが出来ます。それらのものを部品として実装して、最終的に部品を組み立ててプログラムを完成させるというのがオブジェクト指向プログラミングです。D言語では、「クラス」という言語機能によってオブジェクト指向プログラミングをサポートしています。オブジェクト指向プログラミングとは、オブジェクトと呼ばれる機能の部品でソフトウェアを構成させるものであり、一般的に以下の機能や特徴を活用したプログラミング技法のことをいう。
カプセル化 (振る舞いの隠蔽とデータ隠蔽)
インヘリタンス (継承) -- クラスベースの言語
ポリモフィズム (多態性、多相性) -- 型付きの言語
ダイナミックバインディング (動的束縛) -- インタープリタの言語
この機能を文法的に提供するプログラミング言語は、オブジェクト指向プログラミング言語 (OOPL; object-oriented programming language) と呼ばれる。
出典:Wikipedia「オブジェクト指向プログラミング」
これらのオブジェクトは、自分自身の状態を表すデータと、自分自身の振る舞いを表すメソッドというものを持っています。
[予2] クラスって何?
〔この節はクラスベースのオブジェクト指向言語未経験の方向けです。〕
クラスとは、オブジェクトの雛形、つまり設計図を作る為の言語機能です。D言語のクラスは、上で挙げた、「カプセル化・インヘリタンス・ポリモーフィズム」といったオブジェクト指向ではよく使われる概念をほぼサポートしています。
・カプセル化(隠蔽)
カプセル化とは、オブジェクトの内部状態を外部からは直接操作できないようにすることです。つまり、メソッド以外は内部データにアクセスすることを禁じるという意味です。正確に言えば、メソッドもまた隠蔽の対象になりえます。
・インヘリタンス(継承)
インヘリタンスとは、別のクラスをベースにして、新たなクラスを作成することです。クラスAがクラスBを継承しているとき、クラスAを「派生クラス」、クラスBを「基底クラス」といいます。このとき、「AはBから派生している」といったりすることもあります。
派生クラス、基底クラスと同じカテゴリに属することが原則です。これはどういうことかというと、「哺乳類クラス」から「人間クラス」を派生することは、人間は哺乳類の一種なので、全く問題は無いのですが、いくら空を飛ぶからといって、「飛行機クラス」が「鳥クラス」を継承するのは正しくないのです。飛行機と鳥は別のものであって、飛行機は鳥の一種などではありませんからね。
・ポリモーフィズム(多態)
ポリモーフィズムとは、派生クラスによって、基底クラスのメソッドを書き換えることを指します。例えば、哺乳類クラスに「食物の消化をする」というメソッドがあったとして、人間と牛では消化のプロセスが異なるので、「消化をする」というメソッドを派生クラスで置き換えることによって、それぞれのクラスに適切な処理をさせることが可能になります。
[1] とりあえずクラスを定義してみよう
クラスを定義するためには、classキーワードを用いて、次のように宣言します。
D言語では、クラスに属するデータとメソッドについて、それぞれメンバ変数とメンバ関数と呼びます。メンバ変数とメンバ関数の宣言の方法は、それぞれの変数と関数の宣言方法を基本として、そこにアクセス属性を指定することになります。これは、private,protected,public,exportがあります。それぞれの意味は次の通りです。下のほうになるにつれて、そのメンバにアクセスできる範囲が広がります。
private ……… そのクラスのメソッドからのアクセスを許可する。
protected ……… 上に加えて、派生クラスのメソッドからのアクセスを許可する。
public ……… プログラム内のすべてのコードからのアクセスを許可する。
export ……… プログラムの外部のコードからのアクセスも許可する。
► スポイラーを表示
クラス定義の例は、次のようになります。
class Mammalia{
public:
void eat(Food food){/*実装略*/}
void sleep(){/*実装略*/}
protected:
bool digest(Fool food){/*実装略*/}
private:
int age; //年齢
bool starving; //腹減った?
}
属性の指定方法は、上で挙げた方法だけでなく、次のような方法があります。
// ブラケットで括る方法
private{
int hitpoint;
int power;
}
// calcDamageメンバ関数だけがprotected
protected void calcDamage(Enemy enemy){/*実装略*/}
前の記事「Const,Immutable(1)」 ←→ 次の記事「属性(1)とクラス(2)」