インタフェースを用いたポリモーフィズム

インタフェースを使ったポリモーフィズム

コードの微修正

akashi-keirin.hatenablog.com

前回のコードをちょっと書き換えてみた。

擬似コンストラクタのinitメソッドをまとめてみただけですが。

リスト1 インタフェース IMusicPlayer
Option Explicit
'Fields'
Private Name_ As String
'Accessor'
Public Property Get Name() As String
  Name = Name_
End Property
'Methods'
Public Sub init(ByVal n As String)
End Sub
Public Sub play()
End Sub
リスト2-1 RecordPlayerクラス
Option Explicit
Implements IMusicPlayer
'Fields'
Private IMusicPlayer_Name_ As String
'Accessor'
Public Property Get IMusicPlayer_Name() As String
  IMusicPlayer_Name = IMusicPlayer_Name_
End Property
'Methods'
Public Sub IMusicPlayer_init(ByVal n As String)
  IMusicPlayer_Name_ = n
End Sub
Public Sub IMusicPlayer_play()
  Debug.Print "レコードを再生するぜ~♪" & vbCrLf & _
              "針が飛ぶから、暴れるんじゃねーぞw"
End Sub
リスト2-2 CDPlayerクラス
Option Explicit
Implements IMusicPlayer
'Fields'
Private IMusicPlayer_Name_ As String
'Accessor'
Public Property Get IMusicPlayer_Name() As String
  IMusicPlayer_Name = IMusicPlayer_Name_
End Property
'Methods'
Public Sub IMusicPlayer_init(ByVal n As String)
  IMusicPlayer_Name_ = n
End Sub
Public Sub IMusicPlayer_play()
  Debug.Print "CDを再生するぜ~♪"
End Sub
リスト2-3 MP3Playerクラス
Option Explicit
Implements IMusicPlayer
'Fields'
Private IMusicPlayer_Name_ As String
'Accessor'
Public Property Get IMusicPlayer_Name() As String
  IMusicPlayer_Name = IMusicPlayer_Name_
End Property
'Methods'
Public Sub IMusicPlayer_init(ByVal n As String)
  IMusicPlayer_Name_ = n
End Sub
Public Sub IMusicPlayer_play()
  Debug.Print "MP3を再生するぜ~♪"
End Sub

見てお分かりの通り、RecordPlayer、CDPlayer、MP3Playerクラスそれぞれに、「IMusicPlayer_init」メソッドを置いてある。

実行用コード

リスト3 標準モジュール
Public Sub musicPlayerTest()
  'インタフェース型配列に各インスタンスを格納'
  Dim iMPlayer(0 To 2) As IMusicPlayer
  Set iMPlayer(0) = New RecordPlayer
  iMPlayer(0).init "レコードプレーヤー1号"
  Set iMPlayer(1) = New CDPlayer
  iMPlayer(1).init "CDプレーヤ1号"
  Set iMPlayer(2) = New MP3Player
  iMPlayer(2).init "ストロングマシン1号"
  'Nameプロパティの出力とplayメソッドの実行'
  Dim i As Integer
  For i = 0 To 2
    With iMPlayer(i)
      Debug.Print .Name
      .play
    End With
  Next
End Sub

実行結果は前回と全く同じなので省略。

おわりに

initメソッドにしても、playメソッドにしても同じような処理なので、これだけだとイマイチありがた味がないけれど、それぞれのクラスが持つメソッドが

似た機能を実現するんだけれども処理の過程が全然違う

ようなものだったら、ポリモーフィズムの威力が分かりやすくなるかも。

たとえば、ThunderbirdのメールとLotusNotesのメールの作成をどちらも同じcreateMailメソッドの呼び出しだけでできるようにするとか。

何にせよ、うまく使いこなせるようになりたいね。

@akashi_keirin on Twitter