オブジェクトの正体と操作方法が分かったら、今度はオブジェクトの中身をプログラミングしよう。それがクラスの定義だ!
前回は、オブジェクトの構造(内部データやメソッド、プロパティ)と、オブジェクトを操作するためのプログラミングについて見てきました。しかし、オブジェクト指向プログラミング(以下、OOP)は、オブジェクトを操作するだけではありません。もう1つの側面を持っています。それは、オブジェクトそのものをプログラミングすることです。
オブジェクトのプログラミングとは、具体的には、内部データを保持するための変数を宣言し、オブジェクトが持つメソッドやプロパティが呼び出されたときに実行されるコードを記述することです。そして、これらをひとまとまりとして記述した一連のコードは「クラス」あるいは「クラスの定義」と呼ばれます。
■内部データとメソッドを定義したクラスの構造
C#を使用した場合のクラス定義の大まかな構造は、次の図1の右側のようになります。この図では、前回で示したオブジェクトの構造(図左側)と対比させています。
この図1では、「Form」という名前のメソッドに対応するオブジェクトの部分がありませんが、これは「コンストラクタ」と呼ばれる特別なメソッドです。これについては後ほど説明します。
実際には、まずこのようなクラスの定義があり、それを基にして、前回で見たようなオブジェクトをメモリ上に作成することが可能になります。
■クラス定義の詳細
クラスを定義するための記述方法をもう少し詳しく見ていきましょう。VB.NETでのコードとともに、再度クラスの記述例を示します(VB.NET版の「New」メソッドも、C#のFormメソッドと同様に、コンストラクタと呼ばれる特殊なメソッドです)。
リスト内で、青い文字はそれぞれの言語で決められているキーワードです。また、「//」や「'」で始まる緑色の文字はコメント(注釈)です。実際には、この部分にそれぞれの処理内容を記述することになります。
クラスには名前を1つ付けます。ここでは「Form」という名前を付けています(1行目)。これにより、このクラスは「Formクラス」と呼ばれます。
先ほどの図1からも分かるように、クラスの記述は、内部データ用の変数宣言部分と、メソッドあるいはプロパティの定義に分かれます。
内部データのそれぞれの変数宣言は、「フィールド」と呼ばれます。また、各フィールドや各メソッド、各プロパティはクラスの「メンバ」と呼ばれます。上記のFormクラスには、7つのメンバが含まれており、そのうちの3つはフィールドです。
メソッドの定義は、C#ならC言語、VB.NETなら以前のVB 6.0に似ています。プロパティの定義は少し特殊な構造をしていますが、そのプロパティが読み出されるときはget部分が、そのプロパティに対して代入されるときにはset部分が実行される仕組みになっています(プロパティについては前回の「オブジェクトの操作」で解説しました)。
■オブジェクトを初期化するためのコンストラクタ
クラスは、コンストラクタ(constructor)と呼ばれる特別なメソッドを少なくとも1つ持たなければなりません。そして、このメソッドは、初めから名前が決められています。C#では、クラス名と同じ名前(例えば、FormクラスではFormメソッド)、VB.NETでは常に「New」という名前になります。
コンストラクタは、ほかの通常のメソッドとは異なり、クラスからオブジェクトを作成するときに1度だけ自動的に呼び出されます。このためフィールドの初期化(初期値の代入)などの、オブジェクトの初期化に関する処理を記述します。
もしオブジェクトの初期化が不要な場合には、コンストラクタの記述を省略することができます。ただし実際には、コンストラクタを省略した場合でも、中身のない空っぽのコンストラクタが、コンパイラにより自動的に挿入されます。つまり、オブジェクトには少なくとも1つのコンストラクタが必ず存在することになります。
■メンバの公開/非公開を決めるアクセス修飾子
上記のコードをよく見ると、それぞれのメソッドの前に「public」と付いています。これは「アクセス修飾子」と呼ばれるキーワードです。
public(VB.NETではPublic)の付いているメソッドは、オブジェクトを作成したときに、外部から呼び出すことができるメソッドです。もし、publicを付けなければ、外部からは呼び出すことができません。これは「private」と付けた場合と同じ意味となります。つまり、デフォルト(何も付けない場合)では、すべて非公開となります。
privateなメソッドは、クラス内の別のメソッドからしか呼び出すことができません。いくつかのメソッドで同じような処理が重複したので1つのメソッドにまとめた、といった場合には、privateなメソッドとして記述します。
アクセス修飾子は、クラスの定義自体やフィールドにも付けることができます。また、publicやprivate以外のアクセス修飾子も用意されています。詳しくはリファレンス・マニュアルで「アクセス修飾子」や「public」「private」などを検索してみてください。
前回の最後ではオブジェクトのカプセル化について触れましたが、アクセス修飾子はこれを実現するための手段であるといえます。
なお、C#やVB.NETでは、基本的にフィールドはすべてprivateにしておき、フィールドへのアクセス(値の取得や設定)は、必要に応じて個々にプロパティを記述しておくのが一般的です。
続いては、前回で説明を後回しにしていたオブジェクトを生成する方法について見ていきます。
Copyright© Digital Advantage Corp. All Rights Reserved.