次の方法で共有


Visual Basic .NET でのクラスの作成

 

ポール・D・シェリフ
PDSA, Inc.

2001 年 11 月

概要: この記事では、Microsoft Visual Basic .NET でクラスを作成する方法について説明し、クラスに関する Visual Basic 6.0 と Visual Basic .NET の違いについて説明し、クラスにプロパティとメソッドを追加する方法について説明します。 (11ページ印刷)

目標

  • Microsoft® Visual Basic® .NET でクラスを作成する方法について説明します
  • クラスに関する Visual Basic 6.0 と Visual Basic .NET の違いについて説明します
  • クラスにプロパティを追加する方法について説明します
  • クラスにメソッドを追加する方法について説明します

前提条件

  • Visual Basic 6.0 でクラスを作成しました
  • OOP の基礎を理解している
  • Microsoft Visual Studio® .NET で基本的なフォームを作成する方法を知っている

内容

Object-Oriented プログラミングの概要
   クラスの適切な用途
   クラスを作成する
   プロパティの作成
   Read-Onlyのプロパティ
   Write-Only プロパティを作成する
   メソッドを作成する
   コンストラクターへのデータの受け渡し
   すべてのタスクにクラスを使用する
まとめ
   著者について

Object-Oriented プログラミングの概要

Object-Oriented プログラミング (OOP) は、ソフトウェアの設計と構築の方法です。 これは、コードの再利用性と保守容易性を向上させるために、構造化プログラミングの後の次の論理的な進歩です。 もう 1 つの方法として、OOP は、関連する動作 (メソッド) とデータ制限 (プロパティ) を使用して個々のソフトウェア コンポーネント (クラス) を設計する方法であり、これらのコンポーネントをまとめて完全なアプリケーションを作成するのに役立ちます。

OOP の最善の点は、プログラム内のクラスに含まれる個別の変数にデータをグループ化できる点です。 このデータは、アプリケーション内の他のクラスとは異なります。 クラス上の特定のインターフェイスを経由せずに、他のクラスのデータに干渉できるクラスはありません。

各オブジェクトは、その機能を、応答するプロパティとメソッドのセットとして定義します。 他のコードでは、オブジェクトでこれらのメソッドを呼び出し、何らかの動作を実行させ、プロパティを使用して情報を取得または変更できます。 このようにして、コードは他のオブジェクトの情報やプロセスに直接影響を与えることはできません。 クラスをビルドすると、プロパティとメソッドを使用してこの機能を構築する方法が表示されます。

表 1 は、このドキュメントを読む前に既に理解しておく必要がある OOP 用語のレビューです。

表 1: OOP 用語

クラス データとコードのコンテナー。 クラス内のデータには、プロパティを使用してアクセスできます。 このコードはメソッドと呼ばれます。
Object メモリ内のクラスのインスタンス。 インスタンスは、Dim ステートメントと New キーワード (keyword)を使用して作成されます。
コンストラクター オブジェクトが最初にインスタンス化されるときに自動的に呼び出されるプロシージャ。 Visual Basic 6.0 では、コンストラクターは Class_Initialize と呼ばれます。 Visual Basic .NET では、コンストラクターは New と呼ばれます。
Destructor オブジェクトが破棄されたときに自動的に呼び出されるプロシージャ。 Visual Basic 6.0 では、デストラクターは Class_Terminate と呼ばれます。 Visual Basic .NET では、デストラクターは Finalize と呼ばれます。
Properties データを公開し、オブジェクトの外部のコードがオブジェクト データに影響を与えることを許可するために、オブジェクトによって公開されるルーチン。
方法 オブジェクトによって実行できるアクション。 Visual Basic .NET では、メソッドは Subs および Functions として定義されます。

クラスの適切な用途

クラスは、オブジェクト指向言語の心と魂です。 Visual Basic .NET で最も単純なプログラムを記述する場合は常にクラスを使用することになります。 Microsoft .NET Frameworkでは、クラスを幅広く使用しています。そうする必要があります。 クラスの一般的な用途を次に示します。

  • データベース テーブルに対して実行する一連の操作 (データの追加、編集、削除、取得など) をラップします。
  • ファイル内のテキスト行の読み取り、書き込み、インデックス作成などのテキスト ファイルを処理するための操作とデータのセットをラップします。
  • プログラム内のすべてのグローバル変数をクラス内のプロパティにラップします。 これは、何らかの形で多くのプログラムに取り組んでいるように見える "フリーフローティング" グローバルの量を追跡するのに役立ちます。

クラスを作成する

テキスト行を表すクラスを作成してみましょう。 これを行うには、テキスト行を返すプロパティと、テキストの長さを返す読み取り専用プロパティを作成します。 また、行の最初の単語を返すメソッドも作成します。 これらの手順をすべて実行すると、クラスを作成する正しい方法が学習されます。 図 1 に示すようなフォームを作成して、ビルド時に Line クラスをテストします。

図 1. このフォームを使用すると、Line クラスの各プロパティとメソッドをテストできます

フォームを作成するには

  1. Visual Studio .NET を開きます。

  2. 画面の左側にあるツリー ビューから [Visual Basic プロジェクト] を選択します。

  3. プロジェクト テンプレートとして [Windows アプリケーション] を選択します。

  4. アプリケーションの名前を ClassCreation に設定します。

  5. ソリューション エクスプローラー ウィンドウで Form1.vb フォームを選択し、frmLineTest.vb に名前を変更します。 ソリューション エクスプローラー ウィンドウでフォームの名前を変更するには、フォームを右クリックし、ショートカット メニューの [名前の変更] を選択します。

  6. 表 2 に示すように、適切なコントロールを追加し、それらのコントロールのプロパティを設定して、図 1 に示すフォームを作成します。

    表 2: Line クラスをテストするためのフォームのビルドに使用されるコントロール

    コントロール型 プロパティ
    Label 名前 Label1
      Text テキスト行
    TextBox 名前 txtLine
      Text スペインの雨は主に平原にとどまる
    コマンド ボタン 名前 btnDisplay
      Text 表示の長さ
    TextBox 名前 txtLength
      ReadOnly True
    コマンド ボタン 名前 btnGetWord
      Text Wordを取得する
    TextBox 名前 txtWord
      Text  
      ReadOnly True

Line クラスを作成するには

  1. [ 新しい項目の追加 ] ダイアログ ボックスを開くには、[ プロジェクト ] をクリックし、[ クラスの追加] をクリックします。

  2. Name プロパティを Line に設定し、[OK] をクリックします。

  3. これで、プロジェクトに新しいファイルが表示され、Visual Studio .NET 環境内のコード ウィンドウが表示されます。 [コード] ウィンドウには、次のようなコードがあります。

    Public Class Line
    
    End Class
    

    このクラスに対して作成するすべてのプロパティとメソッドは、これらのコード行の間に入力する必要があります。

プロパティの作成

クラス内にプロパティを作成するには、フィールド (つまりパブリック変数) を作成するか、Private 変数を作成し、 Property ステートメントを使用して Private 変数を公開します。 Property ステートメントを使用してプロパティのみを公開する理由はいくつかあります。

  • Public 変数とは対照的に、読み取り専用または書き込み専用のプロパティを作成できます。これは常に読み取り/書き込みになります。
  • Property ステートメント内でエラー処理を追加して、設定されている無効な値をチェックできます。 Public 変数の設定に応答して実行されるコードがないため、Public 変数を設定するときに無効な値をチェックすることはできません。
  • 計算値は、クラス内の実際のデータとして格納されていない場合でも、プロパティとして公開できます。 この例として 、Length プロパティがあります。 変更される可能性があるため、テキスト行の長さを保存したくない場合があります。

次に、Line クラスの LineLength という名前の 2 つのプロパティを作成します。 最初に、クラス内に格納するデータ行を保持するプライベート変数を作成します。 次に、これら 2 つの新しいプロパティの Property ステートメントを作成します。 プロジェクトの クラスを次に示すコードのように変更します。

Public Class Line

    Private mstrLine As String

    Property Line() As String
        Get
           Return mstrLine
        End Get
        Set(ByVal Value As String)
            mstrLine = Value
        End Set
    End Property
     
    ReadOnly Property Length() As Integer
       Get
           Return mstrLine.Length
       End Get
    End Property
End Class

プロパティを作成するための構文は非常に単純ですが、Visual Basic 6.0 で実行した構文とは大きく異なります。 最初に キーワード (keyword) Property を使用し、その後に プロパティの名前を付けてから、このプロパティが取得または設定するデータの種類を指定します。 プライベート変数 mstrLine に含まれるデータを返すには、 Get... を使用します。End Get ブロック。 このブロックは、Visual Basic 6.0 の古い Property Get 関数に似ています。 このコード ブロックは 、Get... の間で任意のコードを実行します。Get ブロックを終了 し、文字列値を返します。 Visual Basic .NET では、 Return ステートメントを使用してデータを返すことができます。

The Set...End Set ブロックは、Visual Basic 6.0 で使用した古い Property Let プロシージャに似ています。 このブロックは、Value という名前のパラメーターを受け入れます。 値は、Visual Studio によって自動的に作成される既定の名前です。 必要に応じて変更できます。 この Set ブロックに渡された値を受け取り、プライベート変数に配置できます。 これは、必要なエラー処理コードを配置できるポイントです。 たとえば、Value パラメーターに渡されるデータに Test などの単語が入力されていないことを確認するチェックがあります。 迷惑メール ワードが渡された場合は、このプロパティの有効な値ではないというエラーが発生する場合があります。

Read-Onlyプロパティ

上記のコードでは、Property ステートメントの前に ReadOnly キーワード (keyword)を使用して、読み取り専用プロパティも作成しました。 このキーワード (keyword)を使用すると、Visual Studio .NET によって Get... が追加されます。Property ステートメントの Get ブロックを終了します。 実際、 Set... を追加しようとするとします。ブロックの設定を終了 すると、コンパイラ エラーが発生します。 Visual Basic 6.0 で読み取り専用プロパティを作成する場合は、 Property Let プロシージャを作成しませんでしたが、中断してもエラーは生成されませんでした。 実行時に プロパティを設定できませんでした。

試してみる

作成したプロジェクトには、1 つのクラスと 1 つのフォームがあります。 次に、新しい Line オブジェクトを作成し、オブジェクトの Line プロパティにテキスト行を配置し、その行の長さをフォームの txtLength テキスト ボックスの Text プロパティに配置するコードをフォームに記述します。

  1. ソリューション エクスプローラー ウィンドウで、frmLineTest フォームをダブルクリックして、デザイン モードでフォームを表示します。

  2. [ 表示の長さ ] ボタンをダブルクリックします。 Visual Basic .NET では、このフォームの背後にあるコードに btnDisplay_Click イベント プロシージャが自動的に作成されます。 必要なのは、以下に示すコード行をプロシージャの本文に入力することです。

    Private Sub btnDisplay_Click( _
      ByVal sender As Object, _
      ByVal e As System.EventArgs) Handles btnDisplay.Click
    
        Dim oLine As Line 
    
        oLine = New Line()
    
        oLine.Line = txtLine.Text
        txtLength.Text = oLine.Length.ToString()
    End Sub
    

このイベント プロシージャ内で、Dim ステートメントを使用して oLine という名前の変数を作成します。 この変数は、Line クラスへの参照として定義されます。 実際には、Dim ステートメントの後の次の行に示すように、New キーワード (keyword)を使用して新しいオブジェクト参照を作成します。 新しいキーワード (keyword)の後に、インスタンス化するクラスの名前を付ける必要があります。 Visual Basic .NET と Visual Basic 6.0 のもう 1 つの違いは、新しいオブジェクトを作成するときに Set キーワード (keyword)を使用しなくなった点です。

Visual Basic .NET では、次のコードに示すように、これら 2 つの行を 1 つに結合できます。

Dim oLine As Line = New Line()
Or
Dim oLine as New Line()

Visual Basic .NET (およびすべての .NET 言語) を使用すると、同じ行で任意の変数を宣言および初期化できます。 Visual Basic 6.0 では、Dim ステートメントが実行可能なコード行ではなくなったため、これを行うことができませんでした。 Visual Basic .NET では、Dim は実行可能なコード行であるため、この構文は完全に有効です。

次に、このイベント プロシージャの次の 2 行を調べてみましょう。

oLine.Line = txtLine.Text
txtLength.Text = CStr(oLine.Length)

最初の行は、オブジェクトの Line プロパティをフォームの txtLine テキスト ボックスの Text プロパティに含まれる値と等しく設定します。 これにより、 Text プロパティのデータが Set... の Value 変数に渡されます Line オブジェクトの End Set ブロック。

これで、txtLine テキスト ボックスに含まれる文字列の長さを報告する準備ができました。 このテキスト ボックスの値は、"スペインの雨は主に平原に留まっています" という文字列と同じ値に設定します。これは、オブジェクト内の mstrLine 変数に含まれる値です。 Line オブジェクトで Length プロパティを呼び出すと、この特定の文字列の長さが返されます。 Length プロパティは整数値であるため、txtLength テキスト ボックスの Text プロパティに配置する前に、その値を文字列に変換する必要があります。 これを行うには、 ToString メソッドを Length プロパティに適用します。

Write-Only プロパティを作成する

書き込み専用プロパティは 、Set... を定義するプロパティです。End Set ブロックと Get なし...End Get ブロック。 実行時にのみこのプロパティにデータを配置できますが、このプロパティからデータを取得することはできません。

この Line クラスを拡張して、ディスク上のファイルからテキスト行を読み取ることができるようにする場合は、ファイル名をこのクラスに渡します。 これを実現するには、書き込み専用プロパティを使用します。 書き込み専用プロパティの例を次に示します。

WriteOnly Property FileName() As String
    Set(ByVal Value As String)
        mstrFileName = Value
    End Set
End Property

この構文は、Property ステートメントのプレフィックスとして WriteOnly キーワード (keyword)を使用するという点で、Visual Basic 6.0 とは再び異なります。 Visual Studio .NET によって Set... が作成されます。自動的にブロックの設定を終了 します。 Get を追加しようとすると...Get ブロックを終了すると、コンパイラによってエラーが発生します。

メソッドを作成する

クラス内のメソッドは、 クラス内のデータに対して何らかの操作を実行するプロシージャです。 または、メソッドは、データに対して何らかの操作を実行し、そのデータを クラスから返す関数である可能性があります。 このクラスのインスタンスからメソッドを呼び出すには、 メソッドを Public として宣言する必要があります。 メソッドが Private と宣言されている場合、クラス内の他のメソッドのみがそのメソッドを呼び出すことができます。 Visual Basic .NET でのメソッドの作成は、Visual Basic 6.0 の場合とまったく同じです。

Line クラスにメソッドを作成し、クラスに渡されたテキスト行を各個別の単語に分割します。 このメソッドは、渡すテキスト行に含まれる最初の単語を返す関数です。 フォームの作成時に指定された文字列を使用した場合、テキスト行は "スペインの雨は主に平原に留まる" になります。この場合、返される最初の単語は "The" になります。

  1. Line.vb クラスをデザイン モードで開きます。

  2. Property ステートメントのすぐ下に、次のメソッドを作成します。

    Public Function GetWord() As String
        Dim astrWords() As String
    
        astrWords = Split(mstrLine, " ")
    
        Return astrWords(0)
    End Function
    

GetWord メソッドは、Split 関数を使用して、文字列を個々の単語の配列に変換します。 Split 関数は Visual Basic 6.0 以降で使用されており、検索する文字列と区切り記号が渡されます。 Split は文字列の最初の文字で始まり、区切り記号が見つかるまで文字列内を移動し続けます。 見つかったら、その時点まですべての文字列を受け取り、新しい配列要素を作成します。 その後、完全な文字列が配列要素に配置されるまで、この方法で文字列の処理を続行します。

文字列を配列に変換した後、 Line クラスに渡す文内の任意の単語を返すことができます。 次の使用例は、配列の最初の要素にアクセスして最初の単語のみを返します。 Visual Basic .NET では、Visual Basic 6.0 の既定値と同様に、すべての配列が 0 から始まります。 ここでの違いは、Visual Basic .NET では 0 から始まる配列以外は作成できず、Visual Basic 6.0 では作成できるということです。

メモmstrLine 変数内の単語を配列に分割するコードを記述するもう 1 つの方法は、次に示すように String オブジェクトで Split メソッドを使用することです。

astrWords = mstrLine.Split(" ".ToCharArray())

試してみる

次の手順に従って、先ほど記述したこの新しい GetWord メソッドを試してください。

  1. frmLineTest フォームをデザイン モードで開きます。

  2. [Get Word] ボタンをダブルクリックします。 これにより、btnGetWord_Click イベント プロシージャが自動的に作成されたコード ウィンドウが開きます。

  3. 次の例に示すように、このイベント プロシージャに次のコードを追加します。

    Private Sub btnGetWord_Click(ByVal sender As Object,_
     ByVal e As System.EventArgs)
    
        Dim oLine As New Line()
    
        oLine.Line = txtLine.Text
        txtWord.Text = oLine.GetWord()
    
    End Sub
    

このイベント プロシージャは、まず Line クラスの新しいインスタンスをオブジェクト変数 oLine に作成します。 次に、txtLine テキスト ボックスの Text プロパティから値を取得して、line クラスの Line プロパティを設定します。 最後に、新しい GetWord メソッドを呼び出すと、文字列値が返されます。 この値は、このペーパーで前に frmLineTest フォームで作成した txtWord テキスト ボックスの Text プロパティに割り当てられます。

コンストラクターへのデータの受け渡し

Visual Basic 6.0 では、クラスの新しいインスタンスを作成したときにデータを渡すことができませんでした。 つまり、オブジェクトを作成し、初期化メソッドを呼び出して、そのメソッドにデータを渡す必要がありました。 オブジェクトの初期化を忘れた場合、オブジェクトは失敗しました。 この初期化メソッドは必ず呼び出 すかもしれませんが、 他のプログラマがクラスを使用している場合は、呼び出しを知らない可能性があります。

コンストラクター メソッドにデータを渡すことができるようになったので、この問題は Visual Basic .NET で解決されました。 コンストラクター メソッドは、Visual Basic .NET では New と呼ばれます。 既定では、Visual Basic .NET では、何もしなくてもこの New メソッドが自動的に作成されます。 このコードはコード モジュール内には表示されませんが、暗黙的に存在します。 この New メソッドにデータを渡す場合は、明示的に作成する必要があります。

New コンストラクターはクラス内の任意の場所に配置できますが、クラス定義の上部に常に近い位置など、標準の場所を選択することもできます。 この次の演習では、String 値を受け入れる New コンストラクターを作成します。 これにより、宣言、オブジェクト変数の初期化、 Line オブジェクトのデータの設定を 1 つの手順で行えるようになります。

  1. プロジェクトで Line.vb クラスを開きます。

  2. 次に示すように、 Sub NewLine クラスに追加します。

    Public Class Line
        Private mstrLine As String
    
        Public Sub New(ByVal Value As String)
            mstrLine = Value
        End Sub
    

New コンストラクターは、1 つ以上のパラメーターを受け入れるように記述するプロシージャです。 先ほど記述したコードで、 Value という名前のパラメーターを作成しました。 その後、値を取得し、プライベート変数 mstrLine に割り当てます。 次に、フォーム内のプロシージャを変更する必要があるため、 txtLine テキスト ボックスからコンストラクターに値を渡します。

  1. frmLineTest.vb フォームを開きます。

  2. 次に示すように、oLine 変数を宣言するには、btnDisplay_Click イベント プロシージャと btnGetWord_Click イベント プロシージャの両方を変更する必要があります。

    Dim oLine As New Line(txtLine.Text)
    

新しいキーワード (keyword)は、Line の新しいインスタンスを作成し、txtLine テキスト ボックスの Text プロパティに含まれるデータを New コンストラクターに渡すよう Visual Basic .NET に指示します。

プロジェクトを実行するには、両方のイベント プロシージャを変更する必要があります。 New プロシージャをパラメーターを受け入れるように変更することで、Line クラスの宣言でオブジェクトを宣言するときにデータを渡す必要があります。

試してみる

イベント プロシージャに変更を加えた後、プログラムをもう一度実行して、正しく実行したことを確認する準備が整います。

  1. F5 キーを押して、このアプリケーションを実行します。
  2. エラーが発生した場合は、修正してもう一度やり直してください。

すべてのタスクにクラスを使用する

すべてのプログラミング タスクのクラスを作成することをお勧めします。 Visual Basic .NET では、モジュール内にスタンドアロンの関数とプロシージャを作成できます。 ただし、従来の構造化プログラミング手法よりも、クラス (およびオブジェクト) を使用する利点は非常に多いです。

  • 計算または操作は、使いやすいインターフェイスにカプセル化 (ラップ) されます。 これにより、新しいプログラマは、すべてがどのように機能するかを知らなくても、手元の問題に取り組むのに役立ちます。 また、古いプロが開発時間を大幅に短縮するのにも役立ちます。
  • パフォーマンスを向上させるために、クラスの内部作業を簡単に変更できます。 このクラスを使用するすべてのプログラムは、パフォーマンスの向上の利点を受け取ります。
  • 1 つのクラスの複数のインスタンスを一度にメモリ内でアクティブにできます。 これにより、あるソースの複数の値を別のソースの値と比較する場合に、複数のパブリック変数を作成する必要がなくなります。
  • クラスから継承し、元のクラスを変更せずに機能を拡張することができます。 継承については、「基本クラスから継承する」という名前の別のドキュメントで説明します。

Visual Basic .NET と Visual Basic 6.0 の違い

Visual Basic .NET で Visual Basic 6.0 からクラスを作成する方法には多くの違いがあります。 主なものの一覧を次に示します。

  • これでパブリック クラスを使用するようになりました...クラスを定義する End クラス。 Visual Basic 6.0 では、各クラスは独自の個別のファイルに存在する必要がありました。
  • ファイルごとに複数のクラスを使用できます。
  • プロパティの宣言は、Visual Basic 6.0 とは完全に異なります。
  • Set キーワード (keyword)を使用してクラスの新しいインスタンスをインスタンス化したり、オブジェクト参照を設定したりしなくなりました。
  • クラスのコンストラクターにパラメーターを渡すようになりました。

まとめ

これで、1 つの読み取り/書き込みプロパティ、読み取り専用プロパティ、およびメソッドを持つクラスが作成されました。 また、このクラスのコンストラクターにデータを渡しました。 このペーパーの冒頭で説明したように、OOP は、アプリケーションをより簡単に作成するのに役立つソフトウェア コンポーネントをまとめる機能について説明します。 Line クラスを作成することで、テキスト行の長さを計算する方法の詳細を記憶したり、Split 関数を使用してテキスト行の最初の単語を返したりする必要はありませんでした。 代わりに、 Line クラスを使用して行を渡し、これらの操作を行うためにプロパティとメソッドを使用しました。 これは、プログラミングに対するはるかにエレガントなアプローチです。

著者について

Paul D. Sheriff は、南カリフォルニアのカスタム ソフトウェア開発およびコンサルティング会社である PDSA, Inc. (www.pdsa.com) の所有者です。 Paul は南カリフォルニアの MSDN 地域ディレクターであり、Visual Basic 6 の Paul Sheriff Teaches Visual Basic という書籍の著者であり、Visual Basic、SQL Server、.NET、および Keystone Learning Systems の Web 開発に関する 72 以上のビデオを制作しています。 Paul は、 jumpstart というタイトルの書籍 ASP.NET 共同編集しました。 詳細については、PDSA, Inc. Web サイトを参照してください。

情報伝達グループについて

情報通信グループ(www.informant.com)は、情報技術分野を中心とした多様なメディア企業です。 ソフトウェア開発出版物、カンファレンス、カタログ発行、Webサイトを専門とするICGは、1990年に設立されました。 米国と英国にオフィスを構え、ICGは、質の高い技術情報に対するITプロフェッショナルの意欲を満たし、尊敬されるメディアおよびマーケティングコンテンツインテグレーターを務めてきました。

Copyright © 2001 Informant Communications Group and Microsoft Corporation

技術編集:株式会社PDSA、KNGコンサルティング