インターフェイスとポリモーフィズム

 インターフェイスは抽象メソッドで構成され、実装したクラスで具象化(実際の処理を定義)します。そのため、プログラムの仕様を作るように扱うことができます。

 例えば、パソコンなどについているUSB(Universal Serial Bus)は規格または仕様であって、何かの部品そのものを指すわけではありません。USBの仕様を実装しているパソコンや、記憶装置、携帯端末などがあります。同じ仕様を実装している物同士、つなげていろいろなことができます。

USBは様々な種類のものに実装されている
USBは様々な種類のものに実装されている

 USBを実装しているものはそれぞれ別々に設計され、作られている点に注目してください。パソコンを作るときには、USBを実装している部品を差し込めるようにUSBで規定されているサイズの差込口を用意し、差し込んだ部品からどのようにデータなどを読み書きするかを具体的に設計して、製造します。USBを実装している部品は必ずUSBで規定されているサイズの接続部を持っていて、何らかの処理を行えると仮定してパソコンを設計・製造することができます。

 インターフェイスも同様に、プログラム上の仕様を策定して、それぞれのクラスで実装させることによって個々のクラスを作りやすくすることができます。

 ではこれから、IDripインターフェイスを実装したいくつかの種類の飲み物を作ってみましょう。また、IDripインターフェイスを実装した飲み物を扱うことのできるドリッパーマシンも作成してみましょう。

○ プロジェクト

 プロジェクトを作成して確認してみましょう。

プロジェクトの種類 コンソール アプリケーション
プロジェクト名 InterfacePlymoTest

サンプルダウンロード

○ 作成の準備

 「InterfaceTest」プロジェクトを修正して作成しましょう。InterfaceTestフォルダーをコピーして、作成するプロジェクト名にフォルダー名を変更してください。

○ プログラム

 IDripインターフェイスを実装したティークラスを作成してください。

Tea.vb

  1. Public Class Tea
  2.  Implements IDrip
  3.  'フィールド
  4.  Private name As String = "ティー"
  5.  'メソッド
  6.  Public Function Drip() As String Implements IDrip.Drip
  7.   Return Me.name
  8.  End Function
  9.  Public Function DripWithMilk() As String Implements IDrip.DripWithMilk
  10.   Return "ミルク" & Me.name
  11.  End Function
  12. End Class

○ クラス図

○ 解説

 7~9行目では、IDripインターフェイスのDripメソッドをオーバーライドしています。このメソッドはフィールドに設定されている飲み物を返します。今回は紅茶が注がれるイメージとして文字列を返しています。

 11~13行目では、IDripインターフェイスのDripWithMilkメソッドをオーバーライドしています。このメソッドはミルクと紅茶を返すことでミルクティーを注ぎます。

○ プログラム

 次に、ドリップする機械を表すDripperクラスを作成しましょう。次にようにクラスを作成してください。

Dripper.vb

  1. Public Class Dripper
  2.  Private milkflag As Boolean = False     'ミルクを注ぐ場合:True 注がない場合:False
  3.  Public Sub SetMilkStatus(flag As Boolean)
  4.   Me.milkflag = flag
  5.  End Sub
  6.  'セットした飲み物を注ぐメソッド
  7.  Public Function DripDrink(drink As IDrip) As String
  8.   If milkflag Then
  9.    Return drink.DripWithMilk()
  10.   Else
  11.    Return drink.Drip()
  12.   End If
  13.  End Function
  14. End Class

○ クラス図

○ 解説

 2行目では、飲み物を注ぐときにミルクも一緒に注ぐかどうかの状態を保持するフィールドが定義されています。4~6行目のメソッドでその状態を設定します。

 9~15行目で飲み物を注ぎます。その時に注ぐ飲み物のオブジェクトを渡すようになっています。ここで注目できるのは引数の型が「IDrip」型であるという点です。この型を実装しているオブジェクトであればセットできます。この仕組みにより、このドリッパーがある特定の飲み物用のものではなく、IDripという仕様を実装している飲み物であればこのドリッパーを使うことができます。このような仕組みのため、ドリッパークラスは具体的にどんな飲み物がセットされるかを意識せずに設計することができるわけです。

○ プログラム

 では次にMainメソッドを修正しましょう。

Module1.vb

  1. Sub Main()
  2.  'ドリッパーオブジェクトを生成
  3.  Dim dripper As New Dripper()
  4.  While True
  5.   'メニューを入力
  6.   Console.WriteLine("飲み物を選んでください。")
  7.   Console.Write("1)珈琲 2)紅茶 9)終了:")
  8.   Dim drink As String = Console.ReadLine()
  9.   If drink = "9" Then
  10.    'プログラムを終了する
  11.    Return
  12.   End If
  13.   Console.Write("ミルクは注ぎますか(Y/N):")
  14.   Dim milk As String = Console.ReadLine()
  15.   'ミルクの状態をドリッパーにセットする
  16.   If milk = "Y" Then
  17.    dripper.SetMilkStatus(True)
  18.   ElseIf milk = "N" Then
  19.    dripper.SetMilkStatus(False)
  20.   End If
  21.   '入力内容によって分岐する
  22.   Dim cup As String = ""
  23.   Select Case drink
  24.    Case "1"
  25.     'コーヒーを注ぐ
  26.     cup = dripper.DripDrink(New Coffee())
  27.    Case "2"
  28.     '紅茶を注ぐ
  29.     cup = dripper.DripDrink(New Tea())
  30.   End Select
  31.   'カップの中身を表示する
  32.   Console.WriteLine("カップには{0}が入っています。", cup)
  33.  End While
  34. End Sub

○ 解説

 5行目では、ドリッパーオブジェクトを作成しています。その後、メニューを表示して、コーヒーか紅茶を選びます。そして、ミルクを注ぐかどうかを入力します。ミルクを注ぐ場合は23行目にある、ドリッパーオブジェクトのSetMilkStatusメソッドにTrueをセットしてミルクを注ぐ準備をさせます。注がない場合は25行目にある、ドリッパーオブジェクトのSetMilkStatusメソッドにFalseをセットしてミルクの設定を解除します。

 29行目では飲み物を注ぐためのカップを用意しています。30~37行目では選択した飲み物に応じて処理を分岐しています。コーヒーを選択した場合は、33行目の処理が実行されます。この処理はドリッパーオブジェクトのDripDrinkメソッドを呼び出す時にコーヒーオブジェクトを生成して渡しています。結果としてコーヒーが注がれます。なお、ミルクを注ぐ準備がされている場合はミルクコーヒーが注がれます。36行目ではティーオブジェクトを生成して、紅茶を注いでいます。そして、40行目でカップの中身を表示しています。

○ 実行結果

飲み物を選んでください。
1)コーヒー 2)紅茶 9)終了:1
ミルクは注ぎますか(Y/N):Y
カップにはミルクコーヒー(微糖)が入っています。
飲み物を選んでください。
1)コーヒー 2)紅茶 9)終了:1
ミルクは注ぎますか(Y/N):N
カップにはコーヒーが入っています。
飲み物を選んでください。
1)コーヒー 2)紅茶 9)終了:2
ミルクは注ぎますか(Y/N):N
カップにはティーが入っています。
飲み物を選んでください。
1)コーヒー 2)紅茶 9)終了:2
ミルクは注ぎますか(Y/N):Y
カップにはミルクティーが入っています。
飲み物を選んでください。
1)コーヒー 2)紅茶 9)終了:9
(終了)

前へ   次へ