とりこらぼ。

Learn from yesterday,
live for today,
hope for tomorrow.

目次

Blog 利用状況

ニュース

プロフィール

  • 名前:とりこびと
    とるに足らない人間です。

  • Wankuma MVP
    for '平々凡々'

Web Site

  • Memo(Of T)

もうひとつの Blog

広告っぽい

書庫

日記カテゴリ

Visual Basic で○○を作ってみよう。その6。 - インターフェイスとかつくってみたらええやん。その2。-

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 プロパティを実装する。」ですね。



前回と、今回で、インターフェイスを作ることと、インターフェイスを実装するクラスを作ることをやってみました。次回、まとめにしますね。

投稿日時 : 2007年5月10日 10:18

Feedback

# re: Visual Basic で○○を作ってみよう。その5。 - インターフェイスとかつくってみたらええやん。その2。- 2007/05/10 11:16 επιστημη

> 複数のインターフェイスを実装すると、多重継承と同様の結果が得られます。

ふっ、一体これのドコが"多重継承と同様の結果"なんだか…
# と煽ってみるテスト♪

# re: Visual Basic で○○を作ってみよう。その5。 - インターフェイスとかつくってみたらええやん。その2。- 2007/05/10 11:48 ぽぴ王子

とりこびと
「オラァ見ただよ!山のむごうさパーッと光る円盤が飛んでいったの見ただ!
…まちがえただ。
1/144ジオングに1/100ドムの足をつけてパーフェクトジオング作っただ!
…またまちがえただ。
『複数のインターフェイスを実装すると、多重継承と同様の結果が得られます』ってのは
MSDN に書いてあったのをコピペしただけだぁ!オラなんぬもわるぐね!」

とか代弁してみるテスト。

# まぁたしかに、これで「同様の結果」って言っちゃうのはいかがなものか…とは思いますが。

# interface ≠ multiple-inheritance 2007/05/10 11:54 東方算程譚

interface ≠ multiple-inheritance

# interface ≠ multiple-inheritance 2007/05/10 12:34 東方算程譚

interface ≠ multiple-inheritance

# re: Visual Basic で○○を作ってみよう。その5。 - インターフェイスとかつくってみたらええやん。その2。- 2007/05/10 13:15 とりこびと

コメントありがとうございます。

# 書かなくちゃいけないことだったので、次回のまとめで書く予定でしたよ、と言い訳してみるテスト。

>> επιστημηさん

>一体これのドコが"多重継承と同様の結果"なんだか…

なので、私の文面では'多重継承みたいな感じ'にとどめました。(すでに逃げ腰w

>interface ≠ multiple-inheritance

トラックバックありがとうございます。(ってか、書くの速すぎ。
とても勉強になります。
ホントにお世話に投げっぱなしジャーマン・・・じゃなかった、なりっぱなしですね。



>>ぽぴ王子さん

>…まちがえただ。

のちの UFO クラスである。

>1/144ジオングに1/100ドムの足をつけてパーフェクトジオング作っただ!

それはここです。
http://d.hatena.ne.jp/torikobito/20070509/p1

># まぁたしかに、これで「同様の結果」って言っちゃうのはいかがなものか…とは思いますが。

さて、次のエントリは謝罪から入らないとwww

# re: Visual Basic で○○を作ってみよう。その5。 - インターフェイスとかつくってみたらええやん。その2。- 2007/05/10 13:41 通りすがり

>さて、次のエントリは謝罪から入らないとwww
タイトルのことでしょうか?

# re: Visual Basic で○○を作ってみよう。その5。 - インターフェイスとかつくってみたらええやん。その2。- 2007/05/10 13:43 とりこびと

通りすがりさん、コメントありがとうございます。

>タイトルのことでしょうか?

ひぃ~!修正しときます。m(_ _)m

# re: Visual Basic で○○を作ってみよう。その6。 - インターフェイスとかつくってみたらええやん。その2。- 2007/05/10 13:59 επιστημη

てか勉強会ネタできたぢゃん♪
IHello と IWorld を実装してですね…

# re: Visual Basic で○○を作ってみよう。その6。 - インターフェイスとかつくってみたらええやん。その2。- 2007/05/10 14:20 とりこびと

επιστημη さん、コメントありがとうございます。

>てか勉強会ネタできたぢゃん♪

おもしろそうですね。
ってか、Hello, world!ってレベルやらボリュームやら決めにくいです・・・。

# re: Visual Basic で○○を作ってみよう。その6。 - インターフェイスとかつくってみたらええやん。その2。- 2007/05/10 18:55 通りすがり

今回の IUnidentifiable ってインターフェイスではなく UnidentifiedAttribute にする手もあると思うのですが、どうでしょ?
私はなんとなく以下の基準で考えるので、現状だと「属性」の方がいいかもって思います。
# って、多重継承の話が台無しですがw
未確認なヤツに何かをさせたい場合 → IUnidentifiable
未確認なヤツだったら何かをしたい場合 → UnidentifiedAttribute
# リアルで未確認なヤツに未確認ですか?って質問してハイと答えられたときのことを想像中w

# re: Visual Basic で○○を作ってみよう。その6。 - インターフェイスとかつくってみたらええやん。その2。- 2007/05/11 9:02 とりこびと

通りすがり さん、コメントありがとうございます。

なるほど。勉強になります。m(_ _)m

>未確認なヤツに何かをさせたい場合 → IUnidentifiable
>未確認なヤツだったら何かをしたい場合 → UnidentifiedAttribute

ほほー。なんだかスッキリしますねぇ。
勉強不足ですね。ちょっと考えてきます。m(_ _)m

# Visual Basic で○○を作ってみよう。その7。 - ちょいと知っといたらええやん。 - 2007/05/16 16:22 とりこびと ぶろぐ。

Visual Basic で○○を作ってみよう。その7。 - ちょいと知っといたらええやん。 -

タイトル
名前
Url
コメント