Visual Basic .NET でのメソッドのオーバーロード

 

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

2001 年 11 月

概要: この記事では、渡したパラメーターの型に基づいて、コンパイル時に呼び出すメソッドを Microsoft Visual Basic .NET がどのように把握するかについて説明します。 この手法は、メソッド のオーバーロード と呼ばれます。 (8ページ印刷)

目標

  • メソッドをオーバーロードする理由について説明します
  • オーバーロードされたメソッドを作成する
  • クラスの独自のコンストラクターを作成する

前提条件

このドキュメントを最大限に活用するには、次のことが当てはまります。

  • OOP の手法を理解している
  • Microsoft .NET でクラスをビルドする方法を知っている

内容

メソッドのオーバーロード
Visual Basic 6.0 以降の新機能
まとめ

メソッドのオーバーロード

パラメーターのみを変更して、それぞれが本質的に同じことを行う関数のグループを作成したいと思ったことはありますか? これを実現するには、省略可能なパラメーターを使用するか、関数の名前を変更します。 どちらの手法も機能しますが、あまりエレガントではありません。 Microsoft® Visual Basic® .NET などの OOP 言語では、同じ名前の異なる引数リストを持つクラスにメソッドを作成できます。 Visual Basic .NET では、渡したパラメーターの型に基づいて、コンパイル時に呼び出すメソッドを把握できます。 この手法は、メソッド のオーバーロード と呼ばれます。 同じ名前を使用する利点は、ユーザー インターフェイスの一貫性が保たれることです。入力のみが異なります。 メソッド内の機能は、新しいオーバーロードされたメソッドごとに変更されます。

ドキュメント "Creating Classes" で作成した Line クラスは 、GetWord メソッドを使用して、テキスト行の最初の単語を返します。 このドキュメントでは、この GetWord メソッドのバージョンをさらに 2 つ作成します。 最初のバージョンでは、行から取得する単語の位置を表す数値を渡します。 2 番目のバージョンでは、検索文字列を渡します。メソッドは、その文字列を含むテキスト行の最初の単語を返します。

メソッドの シグネチャ は、名前、パラメーター、戻り値の型で構成されます。つまり、メソッドの 1 つの "flavor" を別の "flavor" と区別する引数です。 これら 3 つのメソッドのシグネチャは、次のコード行のようになります。

Function GetWord() As String
Function GetWord(ByVal Position As Integer) As String
Function GetWord(ByVal Search As String) As String

メソッドの名前 (GetWord) は、上記の各メソッドで同じままですが、引数リストはそれぞれ異なります。 コンパイラは、これらの異なる "シグネチャ" に基づいて、これらの各名前を解決できます。戻り値は各メソッドで同じであることに注意してください。 戻り値を同じに保つことは必須ではありませんが、通常、オーバーロードされたメソッドの戻り値は変更されません。 メソッドの戻り値の型のみを変更しても、メソッドはオーバーロードされません。 これを行おうとすると、Visual Basic .NET では、戻り値の型を変更してメソッドをオーバーロードできないことを示すエラー メッセージが表示されます。 メソッドが異なるシグネチャを持ち、オーバーロードされるように、少なくとも 1 つの引数を変更する必要があります。

メソッドをオーバーロードする理由

メソッドをオーバーロードすると、インターフェイスの一貫性を維持でき、渡すデータの種類に関係なく、同じメソッドを論理的に呼び出すことができます。 同じ名前を使用すると、新しい名前や名前付け規則を思い付く必要があるのではなく、プロシージャの動作を覚えておくのに役立ちます。

2 つのオーバーロードされたメソッドをビルドする

Line クラスで元の GetWord メソッドをオーバーロードする 2 つの新しい GetWord メソッドを作成しましょう。 最初の新しい GetWord メソッドは整数パラメーターを受け取り、メソッドに渡す位置にある単語を返します。 2 番目の GetWord メソッドは文字列パラメーターを受け取り、元のテキスト行内でその文字列を検索します。 検索文字列が見つかった場合は、その位置にある単語がこのメソッドから返されます。

図 1. メソッドのオーバーロードをテストするために使用される画面

  1. Visual Studio .NET を使用して新しい Windows アプリケーション プロジェクトを作成します。 または、"クラスの作成" というドキュメントを読んだ場合は、同じプロジェクトを使用し、次の手順に従って Windows フォームを変更して、このプロジェクトを操作できます。

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

    表 1 Line クラスで GetWord オーバーロード メソッドをテストするフォームのビルドに使用されるコントロール

    コントロール型 プロパティ Value
    Label 名前 Label1
      Text テキスト行
    TextBox 名前 txtLine
      Text スペインの雨は主に平原にとどまります
    コマンド ボタン 名前 btnDisplay
      Text 表示の長さ
    GroupBox 名前 fraWord
      Text Wordの出現箇所を見つける
    Label 名前 Label2
      Text 「Word」と入力します
    TextBox 名前 txtWordNum
      Text 1
    コマンド ボタン 名前 btnGetWord
      Text Wordを取得する
    TextBox 名前 txtWord
      Text  
      ReadOnly True
    GroupBox 名前 fraWord2
      Text Wordを検索する
    Label 名前 Label3
      Text 「Word」と入力して検索する
    TextBox 名前 txtSearch
      Text スペイン
    コマンド ボタン 名前 btnGetWord2
      Text Wordを取得する
    TextBox 名前 txtWord2
      Text  
      ReadOnly True
  3. Visual Studio .NET メニューから、[ プロジェクト ] をクリックし、[クラスの追加] をクリックして、新しい クラスを追加します。

  4. メッセージが表示されたら、このクラスの名前を Line.vb に設定し、[OK] をクリック します

  5. 次のコードを追加して、この Line クラスを作成します。

    Public Class Line
        Private mstrLine As String
    
        Property Line() As String
            Get
                Return mstrLine
            End Get
            Set
                mstrLine = Value
            End Set
        End Property
    
        ReadOnly Property Length() As Integer
            Get
                Return mstrLine.Length
            End Get
        End Property
    
        Public Function GetWord() As String
            Dim astrWords() As String
    
            astrWords = mstrLine.Split(" ".ToCharArray())
    
            Return astrWords(0)
        End Function
    End Class
    
  6. GetWord メソッドを変更し、次のコードに示すように、キーワード (keyword) Overloads を追加します。

    Public Overloads Function GetWord() As String
    

    Overloads キーワード (keyword)は、同じメソッドの複数のバージョンを作成するたびに必要です。 次に、 GetWord メソッドの追加バージョンを作成します。

  7. Integer 値を受け取り、文字列を返す新しい GetWord メソッドを作成します。 宣言は、次のコード一覧に記載されています。

    Public Overloads Function GetWord(_
     ByVal Position As Integer) As String
        Dim astrWords() As String
    
        astrWords = mstrLine.Split(" ".ToCharArray())
    
        If Position > astrWords.Length Then
            Return ""
        Else
            Return astrWords(Position - 1)
        End If
    End Function
    

GetWord メソッドは、String クラスの Split メソッドを使用して、文字列を個々の単語の配列に変換します。 mstrLine 変数は文字列オブジェクトとして定義されているため、 Split メソッドがあります。 この Split メソッドは、区切り記号の Char 配列を受け取ります。 Char 配列変数を宣言して 1 つのスペースを設定する代わりに、ボックス化と呼ばれる手法 利用できます。

ボックス化とは、1 つのスペースなどのリテラルを、そのリテラルの暗黙のオブジェクト (この場合は文字列オブジェクト) に変換するプロセスです。 このボックス化が行われたら、この新しく作成された文字列オブジェクトの ToCharArray メソッドを適用して、1 文字の配列を返すことができます。 この単一要素配列は、文字列内の単語を区切る区切り記号として使用するために Split メソッドに渡されます。

単語の配列が作成されたので、このメソッドに渡した数値に対応する単語を返すことができます。 もちろん、渡した数が配列内の単語数を超えないことを確認するには、常にチェックする必要があります。

試してみる

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

  2. フォームの最初の [Get Word] ボタンをダブルクリックし、Click イベントに次のコードを追加します。

    Protected Sub btnGetWord_Click(ByVal sender As Object, _
     ByVal e As System.EventArgs) Handles btnGetWord.Click
        Dim oLine As Line = New Line()
    
        oLine.Line = txtLine.Text
        txtWord.Text = _
         oLine.GetWord(txtWordNum.Text.ToInt32())
    End Sub
    

このバージョンの GetWord メソッドは Integer データ型を必要とするため、 ToInt32 メソッドを使用して Text プロパティの値を Integer に変換する必要があります。

  1. プロジェクトを実行するには、最初のテキスト ボックスに数値を配置し、[Word取得] ボタンをクリックします。 入力した番号に応じて、この最初のボタンの横にある読み取り専用テキスト ボックスに単語が表示されます

  2. 検索文字列を引数として受け入れる GetWord メソッドの別の新しいバージョンを追加します。 このバージョンの GetWord では 、テキスト行内でその文字列を検索し、その文字列が見つかった単語を返す必要があります。

    Public Overloads Function GetWord(_
     ByVal Search As String) As String
        Dim astrWords() As String
        Dim intLoop As Integer
    
        astrWords = mstrLine.Split(" ".ToCharArray())
    
        For intLoop = 0 To astrWords.Length - 1
            If astrWords(intLoop).IndexOf(Search) > -1 Then
                Exit For
            End If
        Next
        If intLoop < astrWords.Length Then
            Return astrWords(intLoop)
        End If
    End Function
    

このメソッドでは、単語の配列を作成した後、配列をループしてチェックして、渡した検索文字列が配列内の任意の単語に含まれているかどうかを確認します。 これを行うには、文字列の IndexOf メソッドを使用して、検索する文字列が文字列の一部であるかどうかを確認します。 IndexOf メソッドで検索文字列が見つかると、-1 より大きい数値が返されます。 文字列が見つかったら、 For ループが終了し、その位置にある単語がこのメソッドから返されます。

試してみる

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

  2. 2 つ目の [Wordの取得] ボタンをダブルクリックし、このボタンの Click イベント プロシージャに次のコードを追加します。

    Protected Sub btnGetWord2_Click(ByVal sender As Object, _
    ByVal e As System.EventArgs) Handles btnGetWord2.Click
        Dim oLine As Line = New Line()
    
        oLine.Line = txtLine.Text
        txtWord2.Text = _
         oLine.GetWord(txtSearch.Text)
    End Sub
    

    btnGetWord2_Click イベント プロシージャでは、検索文字列を GetWord メソッドに渡します。 Text プロパティは String データ型を返すので、String データ型を受け入れる GetWord メソッドが呼び出されるメソッドです。

  3. プロジェクトを実行するには、このフォームの 2 番目のテキスト ボックスに数文字を配置し、2 番目の [Word取得] ボタンをクリックします。 入力した文字に応じて、ボタンの横のテキスト ボックスに単語が表示されるか、空白の文字列が表示されます。

オーバーロードされたコンストラクター

新しいオブジェクトをインスタンス化すると、Visual Basic .NET は暗黙的な New メソッドを呼び出します。 New メソッドを自分で記述しない場合は、Visual Basic .NET によってビルドされます。 新しいオブジェクトを作成するときにオブジェクト内の変数を初期化する場合は、オーバーロードされた New メソッドを記述できます。 その後、この New メソッドに 1 つ以上の値を渡すことができます。 New メソッドをオーバーロードすることが、オーバーロードの最も一般的な用途であることがわかります。

  1. Line.vb クラス モジュールを開き、次に示すコードを追加します。

    Public Sub New()
        ' Do Nothing
    End Sub
    
    Public Sub New(ByVal Line As String)
        mstrLine = Line
    End Sub
    

最初に作成した New メソッドは、パラメーターを渡さないときに、新しい Line オブジェクトの作成を処理します。 パラメーターを使用して別の New メソッドも作成するため、Overloads キーワード (keyword)を使用する必要があります。

もう 1 つの New メソッドは、文字列引数を受け取ります。 この文字列引数は、オブジェクトが作成され、テキスト行を保持するプライベート変数に割り当てられるときに渡されます。

試してみる

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

  2. いずれかの GetWord コマンド ボタンをダブルクリックします。

  3. 次のコードと一致するようにコードを変更します。

    Protected Sub btnGetWord_Click(ByVal sender As Object, _
     ByVal e As System.EventArgs) Handles btnGetWord.Click
        Dim oLine As Line = New Line(txtLine.Text)
        txtWord.Text = _
         oLine.GetWord(txtWordNum.Text.ToInt32())
    End Sub
    
  4. F5 キーを押して、このサンプルを試します。

oLine オブジェクトの宣言が txtLine テキスト ボックスから値を渡すようになったことに注意してください。 これは、 Dim ステートメントが実行可能コードではない Visual Basic 6.0 とは異なります。 Dim ステートメントが実行可能になりました。

Visual Basic 6.0 以降の新機能

メソッドをオーバーロードする機能は Visual Basic .NET のまったく新しい機能であり、以前のバージョンの Visual Basic では同等の機能はありません。

まとめ

メソッドのオーバーロードは、メソッドの意図を明確に保ち、異なるパラメーターがメソッドから返される値に影響を与えることを可能にする優れた方法です。 メソッドをオーバーロードするには、戻り値の型だけでなく、パラメーターを変更する必要があります。 オーバーロードするメソッドを決定するときは、メソッドの意図に一貫性を保つ必要があります。 メソッドをオーバーロードできるからといって、必ずしも必要であるとは限りません。 メソッドの意図と、作成するさまざまなメソッドが基本的に同じことを行うかどうかを常に考えてください。

著者について

Paul D. Sheriff は、南カリフォルニアのカスタム ソフトウェア開発およびコンサルティング会社である PDSA, Inc.の所有者です。 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.pdsa.com) を参照してください。

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

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

Copyright © 2001 Informant Communications Group and Microsoft Corporation

技術編集: PDSA, Inc.