インタフェースを用いたポリモーフィズム
インタフェースを使ったポリモーフィズム
コードの微修正
前回のコードをちょっと書き換えてみた。
擬似コンストラクタの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メソッドの呼び出しだけでできるようにするとか。
何にせよ、うまく使いこなせるようになりたいね。