連載:VB 6ユーザーのための
これならマスターできるVB 2005超入門

第9回 そろそろまじめにクラスに取り組んでみようか

羽山 博
2007/06/06
Page1 Page2 Page3 Page4

サンプル・プログラム13 − クラスとオブジェクトを理解するためのプログラム

 クラスとは、データやそのデータを処理するための手続きをまとめたものである。ただし、クラスはひな型であり、実体(実際の「モノ」)ではない。クラスというひな型を基に作られた実体のことはオブジェクトやインスタンスと呼ばれる……、といった話はどの本にでも書いてある。

 また、クラスとは「人間」という概念のようなものであり、個々の人間がオブジェクトに当たる、という例え話もどこかで聞いたことがあるだろう。クラスからオブジェクトを作るには、Newキーワードを使って、

Dim r As New Random()

のような書き方にするということも、この連載で何度か説明した。この例であれば、乱数を利用するためのRandomクラスの新しいオブジェクトが作成される。

 しかし、これだけで分かるようなら誰も苦労はしない。何となくは分かる気がするが、どうしても実感がわかないという人も多いはずだ。

 それはなぜか?

 答えは簡単。自分でクラスを作ったことがないからだ。早い段階でクラス・ライブラリを利用することはあっても、クラスを作成するという話は教科書の最後の方にならないと出てこない(この連載でも9回目にして、ようやくクラスというのは遅かったかもしれない)。何も、クラスのすべてを理解する必要はない。簡単なクラスを定義して、オブジェクトを作成するだけで、実感がわいてくるはずだ。プログラミングを身に付けるに当たって、この「実感」を持てるようになるというのはとても大切なことだと思う。

 そこで、今回は簡単なクラスを自分で作ってみることにする。例によって、その働きがよく分かるようにするため、プログラムはできるだけ単純なものにする。図4がそれだ。

 ここでは、ドラクエのようなゲーム・プログラムを思い浮かべてもらうといいだろう。といっても、音楽もグラフィックスもなく、単にモンスターが登場するだけのもの。フォーム上に配置した[モンスター作成]ボタンをクリックすると、モンスターが1匹作られ、その名前と生命力がメッセージ・ボックスに表示される。


図4 クラスからオブジェクトを作る
[モンスター作成]ボタンをクリックすると、Monsterクラスを基に、オブジェクトを1つ作成する。その生命力をメッセージ・ボックスに表示する。

 ここでは、モンスターをクラスとして表す。そして、そのクラスから個々のモンスター(オブジェクト)を作ることにする。

 ところで、話はちょっとそれるが、こういうゲームっぽいプログラムを例にすると「私はそんなプログラムは作らないから関係ない」と思ってしまう人がよくいる。もっと業務寄りの例を取り上げても「人事管理のプログラムは在庫管理をやってる私には関係ないからいいや」と読むのをやめてしまう人がけっこういる。だが、実はゲームのモンスターも、人事データも、商品データも同じような考えで取り扱うことができる。「例としてはこういうものが使われているが、自分の業務に突き合わせて考えてみるとこういうことだな」とぜひ想像力を働かせてほしい。

■クラスを定義する

 話を元に戻そう。フォームのデザインについては、Buttonコントロールを1つ配置するだけなので省略し、さっそくコードを書いてみる。ソリューション・エクスプローラの[コードの表示]ボタンをクリックして、[コード]ウィンドウを表示しよう。最初は何もコードを書いていないので、以下のような内容だけが表示される。

Public Class Form1

End Class
フォームの[コード]ウィンドウの内容
最初の段階では、イベント・ハンドラなどはまだ作成していないので、コードはこれだけしか記述されていない。

 この下に、モンスター・クラスの定義を書いていこう。クラスの名前を「Monster」とすると、まずは、

Public Class Monster

と書けばよい。すると自動的に、クラスの終わりを示すための、

End Class

が挿入される。

 クラス定義の書き方はさほど難しくないが、一般的に表すなら、

アクセス修飾子 Class クラス名
 :
 クラス定義の内容
 :
End Class

となる。先頭の「アクセス修飾子」とは、このクラスにどこからアクセスできるかということで、「Public」や「Private」などが指定できる。今回は、どこからでもアクセスできるPublicを指定しておこう。

 次に、モンスターの性質を表すような変数を宣言する。例えば、モンスターには名前が付いていて、生命力と魔力があるものとしよう。一般的なゲームだと、ほかにも速さ、賢さ、運などがあるかもしれないが、話を簡単にするために、名前、生命力、魔力の3つだけに絞っておく。コードは以下のようになる。

Public Class Form1

End Class

Public Class Monster

  Private strName As String ' モンスターの名前
  Private iHp As Integer    ' モンスターの生命力
  Private iMp As Integer    ' モンスターの魔力

End Class
クラスで使う変数を宣言する
モンスターの名前は文字列、生命力と魔力は整数としておく。各変数はPrivateで宣言しているので、クラスの外からはアクセスできない。

 実は、これらの変数(フィールドやフィールド変数と呼ばれることもある)は、プロパティの値を保持するための変数になる。Privateで宣言し、クラスの外からアクセスできないようにしているのは、これらの値が勝手に変更されないようにするためだ。

 では、生命力の値を取得したり、値を変えたりするにはどうすればいいのだろうか?

 直接、値を変更することはできないが、生命力の値を取得したり、値を変えたりするためのプロシージャを書き、それを呼び出すようにすればよい。そうしておけば、プロパティの値を取得したり設定したりするだけでなく、そのプロシージャの中で、間違った値がプロパティに設定されないようにチェックをかけることもできる。

 まず、生命力を表す「Hpプロパティ」の値を取得したり、設定したりするプロシージャを書いてみよう。Monsterクラスの変数を宣言した後の行に、

Public Property Hp() As Integer

と入力しよう。この行を入力して[Enter]キーを押すと、Get 〜 End GetやSet 〜 End Setなどが自動的に挿入され、以下のようになる。

Public Class Monster

  Private strName As String ' モンスターの名前
  Private iHp As Integer    ' モンスターの生命力
  Private iMp As Integer    ' モンスターの魔力

  ' 生命力を取得/設定するためのHpプロパティ
  Public Property Hp() As Integer
    Get

    End Get
    Set(ByVal value As Integer)

    End Set
  End Property

End Class
Propertyプロシージャを記述する
プロパティを定義するには、Propertyプロシージャにプロパティ名を記述する。Get 〜 End GetとSet 〜 End Setは自動的に挿入される。

 クラスのプロパティの値を利用するときにはGetプロシージャが呼び出され、プロパティを設定するときにはSetプロシージャが呼び出されるという仕組みだ。

 このプログラムでは、特に値のチェックはしないことにするので、Getプロシージャでは単純にiHpの値を返し、Setプロシージャでは単純にiHpに値を代入するだけでいい。

Public Class Monster

  Private strName As String ' モンスターの名前
  Private iHp As Integer    ' モンスターの生命力
  Private iMp As Integer    ' モンスターの魔力

  ' 生命力を取得/設定するためのHpプロパティ
  Public Property Hp() As Integer
    Get
      Return iHp
    End Get
    Set(ByVal value As Integer)
       iHp = value
    End Set
  End Property

End Class
Propertyプロシージャの内容を記述する
値の取得と設定だけなので、最低限の記述にとどめた。GetプロシージャではiHpの値を返し、SetプロシージャではiHpに値を代入する。プロパティに設定された値は、Setプロシージャの引数として受け取ることができる。

 これでHpプロパティが作成できた。同じようにして、モンスターの名前や魔力を取得、設定するためのコードも書いていけばよい。念のためコードを記しておくと、以下のようになるだろう。

Public Class Monster

  Private strName As String ' モンスターの名前
  Private iHp As Integer    ' モンスターの生命力
  Private iMp As Integer    ' モンスターの魔力

  ' モンスター名を取得/設定するためのNameプロパティ
  Public Property Name() As String
    Get
      Return strName
    End Get
    Set(ByVal value As String)
       strName = value
    End Set
  End Property

  ' 生命力を取得/設定するためのHpプロパティ
  Public Property Hp() As Integer
    Get
      Return iHp
    End Get
    Set(ByVal value As Integer)
       iHp = value
    End Set
  End Property

  ' 魔力を取得/設定するためのHpプロパティ
  Public Property Mp() As Integer
    Get
      Return iMp
    End Get
    Set(ByVal value As Integer)
       iMp = value
    End Set
  End Property

End Class
すべてのプロパティを定義した
生命力と魔力のプロパティはプロシージャ名や変数名以外はすべて同じ。モンスターの名前については、引数と戻り値の型がStringになるだけで、ほかはほぼ同じ。

 これで、最も簡単なクラスが1つ自作できた。次は、このクラスからオブジェクトを作ろう……といきたいところだが、その前にもう1つだけプロシージャを書いておこう。それは、初期値を設定するためのプロシージャ。つまり、オブジェクトを作ったときに、あらかじめモンスターの名前とか生命力とか魔力を決めておこうというわけだ。

 実は、「New」という名前のプロシージャを作っておけば、オブジェクトを作ったときにそれが自動的に実行される。このNewプロシージャのことを「コンストラクタ」とも呼ぶのだが、まあそれはいいとしよう。

 クラスの中であれば、どこにNewプロシージャを書いてもいいが、変数の宣言の後ろあたりにコードを追加しておくと分かりやすいだろう。Newプロシージャは単に「Sub」から書き始めればよい。引数を指定することもできるが、ここでは引数を使わずに決まった値を設定しておくことにしよう。

Public Class Monster

  Private strName As String ' モンスターの名前
  Private iHp As Integer    ' モンスターの生命力
  Private iMp As Integer    ' モンスターの魔力

  Sub New()
    strName = "名なしモンスター"
    iHp = 20
    iMp = 10
  End Sub

  Public Property Name() As String
 
 

End Class
Newプロシージャで初期値を設定する
Newプロシージャは「コンストラクタ」とも呼ばれ、クラスのオブジェクトが作られるときに、自動的に実行される。ここでは、名前と生命力、魔力の初期値を設定した。

 では次に、このクラスからオブジェクトを作ってみる。


 INDEX
  連載:VB 6ユーザーのためのこれならマスターできるVB 2005超入門
  第9回 そろそろまじめにクラスに取り組んでみようか
    1.値型と参照型の違いを知ろう
  2.サンプル・プログラム13 − クラスとオブジェクトを理解するためのプログラム
    3.クラスからオブジェクトを作成/共通に使えるプロシージャ
    4.少しだけ背伸びしてオーバーロード
 
インデックス・ページヘ  「これならマスターできるVB 2005超入門」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

業務アプリInsider 記事ランキング

本日 月間
ソリューションFLASH