それでは、ソースコード「Form1.cs」を参照して「名前空間」と「クラス」を確かめてみよう(説明の都合上、コードには若干の変更を加えてある)。
……前略……
namespace WindowsFormsApp1
{
public class Form1 : System.Windows.Forms.Form
{
……中略……
}
}
C#では「namespace」(VBでは「Namespace」)がオブジェクトを分類するための境界線である「名前空間」を意味し、「class」(VBでは「Class」)がオブジェクトそのものである「クラス」を意味する。namespaceに続けて記述されている「WindowsFormsApp1」が名前空間の名称で(VBでは「WindowsApp1」となるので適宜読み替えてほしい*1)、classに続けて書かれている「Form1」がクラスの名称である。
これを先ほどの例の「○○ソフト会社の山田です」と同じように表現すると、
「WindowsFormsApp1名前空間のForm1クラスです」
となり、C#のコードで表記すると「.(ドット)」でつなげて、
「WindowsFormsApp1.Form1」
になる。
当然ながら名前空間とクラスには、始まり(=開始地点)と終わり(=終了地点)がある。この始まりと終わりの間は「スコープ」(=範囲)と呼ばれ、C#の名前空間やクラスではスコープの始まりは「{」で表し、終わりは「}」で表す(VBの名前空間やクラスでは、スコープの終わりに「End Namespace」や「End Class」を記述することで、それぞれのスコープを確定する)。
名前空間のスコープの中では、各行の左端に余白(「インデント」と呼ばれる)が作られているが、これは他の行と開始文字の位置をずらすことで、名前空間のスコープ内であることを明確に表現するためのものである(インデントの設定や調整については、「.NET TIPS:ソース・コードを一瞬で整形するには?」を参照するとよい)。
*1 ただし、VBでは、「WindowsApp1」という名前空間はWindowsフォームを定義するファイル(この場合はForm1.vbファイル)には現れないようになっているので注意しよう。ソリューションエクスプローラーの[My Project]をダブルクリックすると表示されるウィンドウの[アプリケーション]タブにある[ルート名前空間]でこの名前空間になっていることを確認できる。
C#での名前空間(=クラスを分類してグループ化するための境界線)の基本的な書き方は、次の通りだ。
namespace <名前空間の名称>
{
……中略(ここにクラスを書く)……
}
「……中略(ここにクラスを書く)……」の部分にクラスを書き込む。そのクラスの書き方は、次の通りだ。
public class <クラスの名称> : <基底クラスの名称>
{
……中略……
}
classの前にある「public」はアクセシビリティ(アクセス制御)を指定するための修飾子である。このpublic修飾子(VBではPublic修飾子)で修飾されたclassは、「どのクラスからでもアクセス可能な状態」になる。他にも、クラスがあるプロジェクト内(=アセンブリ内)からのみアクセス可能にするinternal修飾子(VBではFriend修飾子)がある。クラスに対してアクセシビリティを明示しない場合、自動的にinternal修飾子が付与される。アクセシビリティは実際のプログラミングで必要になって初めてその価値が理解できると思う。よって、取りあえず現段階では、オブジェクト指向プログラミングではアクセシビリティを設定する必要があるということを知っておいてほしい。
<クラスの名称>に続き「:」(コロン)で区切られて指定されたクラスは、「基底クラス」(Base Class)と呼ばれる(「基本クラス」「スーパークラス」「親クラス」とも呼ばれる)。また、「:」の前にあるクラスは「派生クラス」(Derived Class)と呼ばれる(「サブクラス」「子クラス」とも呼ばれる)。
基底クラスと派生クラスの記述は、新たに作成する派生クラスが基底クラスの全特徴を引き継ぐことを意味している。例えば、冒頭で示した次のコードでは「Form1」クラス(派生クラス)が「System.Windows.Forms.Form」クラス(基底クラス)の全特徴を引き継いでいる。
public class Form1 : System.Windows.Forms.Form
{
……中略……
}
このように、ある基底クラスの全特徴を引き継いで新たなクラスを作成することを、オブジェクト指向では「継承」と呼ぶ。
「継承」を現実世界で例えると、「人間」の全特徴を引き継ぎ、さらに「ボーっとしている」「博多ラーメンが好きである」などの独特な特徴(=個性)が付け加えられて、「山田」という人物が作成されることになる。この例で分かるように、オブジェクト指向の継承は、基底クラスの全特徴を引き継ぎ、さらに何らかの特徴を付け加えて拡張した新たなクラスを作成するための機能である。
なお、継承を使わずに新しいクラスを作成することもできる。その場合には、「: <基底クラスの名称>」の部分を省略すればよい(ちなみにソースコード(Program.csファイル)では、「static class Program」のように、実際に基底クラスの記述が省略されたProgramクラスが定義されている)。
先ほど示したコードにある基底クラスの「System.Windows.Forms.Form」は、名前空間とクラスを「.(ドット)」で連結した書き方で、「System.Windows.Forms名前空間のFormクラス」という意味になる。名前空間の内容が「System.Windows.Forms」というように、「.」でさらに細かく分かれているが、このように名前空間は大分類/中分類/小分類のように階層的な分類を構成することが可能である。これを現実世界の階層的な分類で置き換えるなら、「日本の東京の○○ソフト会社」(=名前空間)の「山田」(=クラス)と表現するのと同じである(C#のように表現すれば「日本.東京.〇〇ソフト会社.山田」クラスとなる)。
ちなみに、言うまでもなく、このSystem.Windows.Forms名前空間のFormクラスは、.NETのクラスライブラリにあらかじめ用意されたクラスである。
それでは次のページで、Form1クラスがどのようにして実行されるのかを見ていこう。
Copyright© Digital Advantage Corp. All Rights Reserved.