Visual Basic で○○を作ってみよう。その1。 - とりあえずやってみたらええやん。-
Visual Basic で○○を作ってみよう。その2。 - クラスとかつくってみたらええやん。-
Visual Basic で○○を作ってみよう。その3。 - クラスとかつくってみたらええやん。その2。-
Visual Basic で○○を作ってみよう。その4。 - 基本クラスとか派生クラスとかつくってみたらええやん。-
Visual Basic で○○を作ってみよう。その5。 - インターフェイスとかつくってみたらええやん。その1。-
いやぁ、その6でかつ、その2ですね。だからなにってワケでもないんですけどね。前回でガッツリ書いてしまってもよかったんですけど、私自身がそんなにいっぱい入んないので分けました。で、前回のあらすじです。
UFO クラスを FlyingObject クラスを継承して作成したとりこびと。その後、UFO の U が Unidentified のことであることに気付き、UnidentifiedObject からの継承も試みる。しかし Visual Basic では多重継承できないという大きな壁が立ちはだかり途方にくれることに・・・。ふと目を落としたMSDNの言葉に一筋の光を見るが・・・
こんな感じでしたね。ホントにドラマティックでした。で、そのMSDNの言葉とは
多重継承をサポートしている言語もありますが、Visual Basic がサポートしているのは単一継承だけです。したがって、派生クラスの基本クラスは常に 1 つだけです。クラスでは多重継承することはできませんが、複数のインターフェイスを実装することはできます。複数のインターフェイスを実装すると、多重継承と同様の結果が得られます。
赤くしたところのことでしたね。もうインターフェイスっきゃないッって感じですか?(そんなことない。
ぼちぼち「いいからはやくインターフェイスつくってみろよ?ほれ?ほれ?」な声が聞こえてきそうですね。
前回もリンクしていたMSDN:Visual Basic におけるインターフェイスの一文を引用しておくと、
インターフェイスは、クラスで実装できるプロパティ、メソッド、およびイベントを定義します。インターフェイスでは機能を密接な関係を持つプロパティ、メソッド、およびイベントの小さなグループとして定義できます。これにより、既存のコードに影響を与えずにインターフェイスの拡張実装を開発できるため、互換性の問題が削減されます。追加のインターフェイスと実装を開発することにより、いつでも新機能を追加できます。
つまり、クラスとかモジュールとかっていう括りではなくプロパティ、メソッド、およびイベントのみを定義するわけですね。(←説明になってない。orz)今回のプロジェクトでいうと Bird クラスとUFO クラスを FlyingObject クラスから派生させました。これはなぜか?どちらも飛ぶという振る舞い(Fly メソッド)を持つモノだからです。しかし、インターフェイスでは、クラスではなく、プロパティ、メソッド、およびイベントだけをグループとするんです。といっても今回はFly メソッドしかそのグループには含まれませんけどね。
なにはともあれ、体感してみましょう。今回は 飛ぶという振る舞い(Fly メソッド)をグループとして飛べる(Flyableな)インターフェイスを作ってみましょうか。
Visual Studio 2005 で、ソリューション エクスプローラから 'Torikobito.FunnyVisualBasic' プロジェクト(まだありますか?w)を選択し、右クリックします。で、メニューの中の[追加]→[新しい項目]と進むとダイアログが出てきますよね。テンプレートの一覧の中から[インターフェイス]を選択し、ファイル名を「IFlyable.vb」に(インターフェイス名には頭に'I'をつけるのが一般的だそうです。)して[OK]です。
Public Interface IFlyable
End Interface
↑こんなの出てきますね。この Public Interface IFlyable と End Interface の間が IFlyable インターフェイスになります。
詳しくは
MSDN:Interface ステートメント (Visual Basic) (http://msdn2.microsoft.com/ja-jp/library/h9xt0sdd(VS.80).aspx)
にありますが、クラスの時と同じく、Visual Basic の文法のようなものだと思って頂いていいと思います。ということは・・・
IFlyable インターフェイス用のファイルを作ったらIFlyable インターフェイスもできちゃった♪
なんとまぁラクチンなのでしょうね。といっても、出来上がった IFlyable インターフェイス、まだ何の役にも立ちません。そりゃぁそうです。だって何も書いてないですし。で、このインターフェイスが定義するものはFly メソッドだと書きましたので、Fly メソッドを定義しましょうか。
Public Interface IFlyable
Sub Fly()
End Interface
はい、これで IFlyable インターフェイスは出来上がりです。インターフェイスでは、実装はありません。定義のみです。じゃ、誰が実装すんの?ってことですが、そのインターフェイスを実装するモノ(クラスとか)が実装するんです。(ややこしいわっ!)まぁまぁ、Bird クラスと、UFO クラスは飛べるので、このインターフェイスを実装してみましょうか。
インターフェイスを実装するには Implements ステートメントとImplements キーワードを使用します。
MSDN:Implements キーワードおよび Implements ステートメント(http://msdn2.microsoft.com/ja-jp/library/4b3c4by9(VS.80).aspx)
まずはBirdクラスから。以前に作成した Bird クラスをこう↓書き換えます。ややこしいので前回やった継承をやめて、インターフェイスの実装だけにしてみましょうね。
Public Class Bird
Implements IFlyable
Public Sub Fly() Implements IFlyable.Fly
End Sub
End Class
言葉にすると、「Bird クラスは IFlyable インターフェイスを実装し、Bird クラスのFly メソッドは IFlyable インターフェイスの Fly メソッドを実装する」となりますか。
同様に、UFO クラスもやります。
Public Class UFO
Implements IFlyable
Public ReadOnly Property IsUnidentified() As Boolean
Get
Return True
End Get
End Property
Public Sub Fly() Implements IFlyable.Fly
End Sub
End Class
「UFO クラスは IFlyable インターフェイスを実装し、UFO クラスのFly メソッドは IFlyable インターフェイスの Fly メソッドを実装する」ですね。
前回、インターフェイスとは、約束することだと書きました。これがどういうことかというと、「IFlyable インターフェイスを実装するクラスはIFlyable インターフェイスの Fly メソッドを実装する」ことを約束するということです。「飛べるというグループの飛ぶという振る舞いは必ず飛ぶんだよ」というお約束ですね。
でもこれ、なんだか首を傾げませんか?
FlyingObject を継承するのと何が違うの?
って思いませんか?私は思います。で、何が違うのかというと!
インターフェイスは1つ以上実装できますよ♪(それだけじゃないんですけどねー♪
ってことは!未確認(Unidentifiableな)インターフェイスを作成してUFO クラスに実装すれば・・・
多重継承みたいな感じになるじゃないですか!
よしよし♪さっそくIUnidentifiable インターフェイスを作りましょう。IUnidentifiable.vb というファイルを作成して以下のように記述します。
Public Interface IUnidentifiable
ReadOnly Property IsUnidentified() As Boolean
End Interface
これを UFO クラスに実装です。複数のインターフェイスを実装するときはImplements IFlyable, IUnidentifiableのように、カンマで区切って記述します。
Public Class UFO
Implements IFlyable, IUnidentifiable
Public ReadOnly Property IsUnidentified() As Boolean Implements IUnidentifiable.IsUnidentified
Get
Return True
End Get
End Property
Public Sub Fly() Implements IFlyable.Fly
End Sub
End Class
「UFO クラスは IFlyable インターフェイスを実装し、UFO クラスのFly メソッドは IFlyable インターフェイスの Fly メソッドを実装する。また、UFO クラスは IUnidentifiable インターフェイスを実装し、UFO クラスのIsUnidentified プロパティは IUnidentifiable インターフェイスの IsUnidentified プロパティを実装する。」ですね。
前回と、今回で、インターフェイスを作ることと、インターフェイスを実装するクラスを作ることをやってみました。次回、まとめにしますね。