VB クラスの作成
Visual Basic 中学校 > 初級講座 >
クラスはVBでプログラムを行ううえで決定的な効果を発揮します。今回からの数回でこのクラスの作り方を説明します。
概要 ・クラスは意味のある一塊(ひとかたまり)の機能があつまったもの。 ・クラスはできるだけ現実世界の「物」をモデルに設計する。 ・単純にクラスを作成するには次の通り記述するだけ。 Public Class MyClassName End Class ・インスタンスが作成されたときにクラスの初期処理を実行するにはコンストラクタを利用する。コンストラクタは名前がNewであるメソッドのこと。 Public Sub New() 'ここに初期処理を書く End Sub ・ クラスが破棄されたときにクラスの終了処理を実行するにはデストラクタとしてDisposeメソッドを記述する。(ただし、これを有効に活用するために本文には紹介する形式を利用しなければならない) Implements IDisposable Public Sub Dispose() Implements IDisposable.Dispose 'ここに終了処理を書く End Sub |
今回からは数回にわたってクラスの作り方を説明します。初級講座では既にクラスを利用する方法について説明してきました。今度はクラスを作る側の立場に立ちます。
VBのプログラムはクラスを基盤として成り立っており、クラスの作り方も知らないで初級講座を卒業することは到底考えられません。とは言え、クラスに関する事柄は奥が深いので初級講座ですべてを説明するのも現実的ではありません。
そこで、ここではクラスの作り方を形式的な側面から説明することにします。その意味や思想についての大部分は中級講座以降で説明します。
形式的な側面といっても、それさえ抑えておけばとりあえずクラスを作成することができるようになるわけで、いろいろとクラスを作って経験を積んでいるうちに見えてくることもあるでしょう。
今回はシンプルなクラスの作成例を紹介し、クラスが作成された場合に自動的に実行されるコンストラクタという初期処理と、クラスが破棄された場合に実行されるデストラクタという終了処理について説明します。
次回からはクラスにメソッド・プロパティ・イベントを組み込む方法をじっくりと説明し、一通り読めばクラス作成について必要な形式的な知識が整うように配慮するつもりです。
みなさんにお願いしたいのは私が取り上げる役に立たないサンプルについて笑って許して欲しいということです。実際にクラスを作成する場合はプログラムの構造上必要があって作成する場合がほとんどなのですが、ここでそのようなプログラムの構造の話からしていてはなかなか本題であるクラスの話に入れません。
ですから、私はたいていの場合このような背景を省略していきなりクラスの例を紹介することになります。しかし、このような事情で私のサンプルはあまり役に立たないつまらないクラスの例となることがほとんどでしょう。
さて、前置きを終えたところでそろそろ本題である深遠なるクラスの話を始めます。
発展学習 - 継承・多態性(ポリモーフィズムス)・隠蔽(カプセル化) 発展学習では意欲的な方のために現段階では特に理解する必要はない項目を解説します。 少しクラスについてかじったことのある方なら、継承・多態性(ポリモーフィズムス)・隠蔽(カプセル化)と言ったような言葉を聞いたことがあるでしょう。抽象クラス・インターフェースという言葉も聞いたことがあるかもしれません。 クラスについての詳しい説明を求めている方のために、初級講座でのクラスの説明ではこれらの事柄はほとんど扱わないことをあらかじめ宣言しておきます。 こういった事柄は中級講座以降で説明する予定です。 |
クラスとは意味のある機能のあつまりです。プログラムをしているとファイルシステムやデータベース、ネットワーク、グラフィックスやサウンドなどと実にいろいろな機能を使用することになります。それらの機能を意味のある単位ごとにわけて管理しているのがクラス(や構造体)です。
そして、クラス(や構造体)はただ単に機能をまとめているだけではなく、人間にとって扱いやすいように現実世界に存在する「物」をモデルとして設計されているのが特徴です。
たとえば、ファイルを操作するFileInfoクラスは現実の「ファイル(書類)」のように設計されています。このことはメソッドやプロパティの意味を考えてみると明らかです。
メソッド・プロパティ | 英語の意味 | プログラム上の機能 |
Open | 開け | 開く |
AppendText | 文字を追加せよ | 文字を追加する |
Length | 長さ | ファイルサイズ |
Name | 名前 | 名前 |
■表1
現実世界には存在しないような物をクラス化する場合でもできるだけ人間の視点でわかりやすく、できるだけ「物」のように設計されています。
そして、クラスを利用する側の立場に立てば、必要な物を実体化し、その物の性質を定義したり、物に対して命令したりして目的の機能を実現していくのがVBのプログラミングスタイルです。
このスタイルは人間にとってとてもわかりやすいプログラミングスタイルであると同時に、意味ごとに機能が分かれていて管理・設計がしやすいなどの利点がありVB以外にも多くのプログラミング言語で採用されています。
「物(オブジェクト)」視点でのプログラミングということで、このスタイルは「オブジェクト指向」と呼ばれています。
さて、クラスを作成する場合にはまずそのクラスがどのような機能のまとまりであるか現実世界の「物」の即して考えてみてください。これはとても重要なことです。
オブジェクト指向の枠からはみ出したクラスを作ってしまうととても扱いにくいクラスができあがってしまうことが多いです。クラスは単体ではなくほかのクラスと連携して動作する場合がほとんどであることもその理由です。
発展学習 - クラスとオブジェクト指向 発展学習では意欲的な方のために現段階では特に理解する必要はない項目を解説します。 VBはオブジェクト指向に基づいてプログラムしたときに最高の機能・性能が発揮できるように設計されています。クラスはこのオブジェクト指向プログラミングを行ううえでもっとも重要な要素です。そのためクラスを設計するにはただ単に似たような機能を集めた便利な入れ物ということ以上に、オブジェクト指向にのっとった設計が必要となるのです。 よく言われるオブジェクト指向の3大機能として継承、多態性、隠蔽があります。これらの詳細は中級講座で扱いますが、こういったこともしっかり把握していないと良いクラス設計は行えません。現実世界の「物」に即したクラスを設計することはオブジェクト指向プログラミングの第一歩です。 |
とは言え、話を簡単にするためにまずは特に意味のないメソッドを1つ持つだけの単純なクラスを作ってみましょう。
まずはいつも通り新しいプロジェクトを作成してください。Windowsアプリケーションで、名前は何でもよいのですが私は「ClassTest」としました。
プロジェクトを作成したら[プロジェクト]メニューで[クラスの追加]を選択してください。
そうすると追加可能なファイルの例が一覧表示されます。この一覧はあらかじめ用意されているテンプレートと呼ばれる例が表示されているだけで、自分でプログラムすればこの一覧にないタイプのクラスを実現することも可能です。ある程度決まりきったプログラムをマイクロソフトが親切心でパターン化して用意しておいてくれているだけです。
今回はシンプルに「クラス」を選択して、名前には「Telephone」と入力して「追加」ボタンを押してください。
Telephoneはテレフォン、つまり電話のことです。
■画像1:クラスの追加
そうするとソリューションエクスプローラにTelephone.vbが追加され、空のクラスのコードも作成されます。
■画像2:ソリューションエクスプローラ上のクラス
空のコードは次のようになっています。
Public Class TelephoneEnd Class |
■リスト1:名前だけ宣言した空のクラス
このコードを見ればすぐわかるようにクラスを作るときは必ずClass 〜 End Class(読み方:Class = クラス)という記述をします。
クラスの内容はこの間に書いていくことになります。
Public(読み方:Public = パブリック)というのはこのクラスがどこからでも呼び出して利用できることを示しています。Publicで宣言したクラスは別のプロジェクトやアプリケーションからも呼び出せます。現在のプロジェクトでのみ使用できるように制限したい場合はFriend(読み方:Friend = フレンド)を使って、Friend Class Telephoneのように宣言します。別のプロジェクトとの連携については第51回 クラスライブラリで説明します。
では、このクラスに電話を鳴らすBellメソッド(読み方:Bell = ベル)を記述してみましょう。以下の通りにしてください。
Public Class Telephone
Private Declare Ansi Function PlaySound Lib "winmm.dll" Alias "PlaySoundA" (ByVal lpszName As String, ByVal hModule As Integer, ByVal dwFlags As Integer) As Integer Private Const SND_ASYNC = &H1
Public Sub Bell()
Dim WaveFile As String |
!doctype>