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

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

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

 さて、ここで、最初に話した内容について思い出してほしい。

 XmlDocumentクラスの場合は、

doc.GetElementsByTagName(……)

のように、「オブジェクト名.メソッド名」と書くのに、Stringクラスの場合は、

String.Format(……)

のように「クラス名.メソッド名」と書く……という話だ。これはStringクラスだから、「クラス名.メソッド名」と書くわけではなく、そのメソッドがここまで見てきたのと同じように、クラスで共通に使えるものだからだ。クラスで使えるものだから、別にオブジェクト(インスタンス)を作らなくても使えるというわけだ。

 これで、かなりモヤモヤが晴れたのではないかと思うが、どうだろう。

 実は、このようなプロシージャ(メソッド)は「スタティック(静的)なメソッド」と呼ばれており、.NET Frameworkのクラス・ライブラリ・リファレンスでは「S」のマークが付けられている(図7)。

図7 .NET Frameworkのクラス・ライブラリ・リファレンスの読み方
「S」のマークが付いているのはスタティックなプロパティやメソッドという意味。これらはクラスで共通に使えるので「クラス名.プロパティ名」あるいは「クラス名.メソッド名」という書き方で利用する。

 例えば、

Dim st As String
st = "Hello"

というコードを記述した場合、変数stに文字列が含まれるかどうかを真偽値で返すContainsメソッドは、

st.Contains("o")

とは書けるが、当然、

String.Contains("o")

とは書けない。

 逆に、書式付きの文字列に変換するFormatメソッドはスタティックなメソッドなので、普通、

String.Format("{0:##.#}", 12.34)

と書く。この場合、結果として返されるのは“12.3”という文字列になる。なお、

st.Format("{0:##.#}", 12.34)

と書いてもプログラムは実行できるが、やはり意味が分かりにくくなるので避けた方がいい。

 ちなみに、Stringクラスに限っては、クラスからオブジェクトを作成するために、Newキーワードを使って、

Dim st As New String("Hello")

と書くこともできるが、プログラムを記述しやすくするために、値型の変数を宣言するような書き方で、

Dim st As String = "Hello"

と記述するのが一般的だ。

■少しだけ背伸びしてオーバーロード

 Monsterクラスのオブジェクトを作成すると、Newプロシージャが呼び出されて、初期値として「名なしモンスター」という名前と、20ポイントの生命力、10ポイントの魔力が設定される。しかし、いつもこの決まった値ではなく、最初から何か別の値を設定したいこともあるだろう。そのような場合には、引数のあるNewプロシージャを追加してやればよい。

Public Class Monster

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

  '引数のないNewプロシージャ
  Sub New()
    strName = "名なしモンスター"
    iHp = 20
    iMp = 10
  End Sub

  '引数のあるNewプロシージャ
  Sub New(ByVal strNewName As String, ByVal iNewHp As Integer, ByVal iNewMp As Integer)
    strName = strNewName
    iHp = iNewHp
    iMp = iNewMp
  End Sub
  :
  :

End Class
Newプロシージャに引数を定義する
名前、生命力、魔力を引数にしたNewプロシージャを追加する。プロシージャ名は同じだが、引数の数が異なるので正しく区別される。

 引数付きのNewプロシージャを追加しておき、オブジェクトを作成するときに、

Dim m1 As New Monster("オヤジスライム", 120, 0)

のように引数を指定すると、引数付きのNewプロシージャが呼び出され、名前が「オヤジスライム」、生命力が120ポイント、魔力が0ポイントのモンスターが作られる。

 もちろん、引数なしで、

Dim m2 As New Monster()

とすれば、引数なしのNewプロシージャが呼び出され、「名なしモンスター」などの初期値が設定される。

 このように、同じプロシージャ名で、引数の個数やデータ型の異なるプロシージャをいくつも記述しておくことは「オーバーロード」と呼ばれている。が、まあ呼び名はともかく、.NET Frameworkのクラス・ライブラリを使うときに、

Dim str As New String("x"c, 4) ' "x"という文字を4つ

でも

Dim str As New String("xxxx") ' "xxxx"という文字列

でも、オブジェクトが作成できるのはこういう仕組みのおかげだ。

結び − まだまだ道のりは長いけれど

 クラスとオブジェクトを使いこなすためには、まだまだ多くの考え方や機能を学ぶ必要がある。だが、それはもう少し先でも構わない。実は、今回のサンプル・プログラムとして、もう1つ別に、モンスターをたくさん作ってListBoxコントロールに登録するようなものを作ったのだが、オブジェクトの破棄、継承、インターフェイスなどについて理解しておく必要があり、まともに説明すると膨大な分量になってしまうので割愛することにした。

 もちろん、機会があれば割愛した話にも進みたいのだが、今回の目的はよく目にする「おまじない」の意味を一通り理解し、モヤモヤ感を解消しようということなので、このあたりにとどめておきたいと思う。取りあえず、今回の内容を理解すれば、.NET Frameworkのクラス・ライブラリ・リファレンスがぐっと読みやすくなると思う。End of Article


 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