Interface


VB.NETにおけるInterfaceが朧気ながら理解。

ふむ・・・なんと説明したらよいのやら・・・「多態」か?
継承とは全く違う話なのね。もっと似たようなものだと思ってたのに。



以下、実践したこと。
Class1にInterface1とInterface2を実装する。
するともちろんのことInterface1と2のメンバの公開が義務付けられる。
ここまではなんとなくわかってたのよね。

今日わかったのはこっから。
あるモジュール内でClass1をNewする。
で適当なSub(Functionでも可)を作って引き数の型にByVal a As Class1を指定すると、
このaはInterface1とInterface2のメンバを保有する。
これは当たり前。

ところがこの引き数をByVal a As Interface1にしてごらんなさいよ。
するとこの時のaってInterface1のメンバしか持ってないわけ!!

思い切りとある掲示板に書いてあった内容なんだけど、
「1人2役任されたオブジェクトが、その時その時で1方の役しか演じなくなる。」
ということ。付け加えれば2役同時に演じさせることもできるってことか。



もう一つ気付いたことは、引き数にInterfaceを指定することで、
そのInterfaceを実装していなければ引き数に渡せないってこと。
上に書いた内容で、Interface1の実装を外して同じSubに通すとキャストエラーで落ちる。

これって独自のクラスライブラリを作成して公開する時はとても有効な物だと思う。
実装の継承だと伝えづらいんじゃないかな〜


以下、この内容のソース。
汚い&適当でごめんなさい・゜・(ノД`)・゜・。

  • Form1
Public Class Form1
    Inherits System.Windows.Forms.Form

    " Windows フォーム デザイナで生成されたコード "

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _
        Handles MyBase.Load

        Dim xxx As New Class1

        Call Test1(xxx)
        Call Test2(xxx)

    End Sub

    Private Sub Test1(ByVal a As Interface1)

        a.Method1("a")

    End Sub

    Private Sub Test2(ByVal a As Interface2)

        a.Method2("b")

    End Sub

End Class
  • Module1
Module Module1

    Public Interface Interface1
        Function Method1(ByVal V1 As String)
    End Interface

    Public Interface Interface2
        Function Method2(ByVal V1 As String)
    End Interface

End Module
  • Class1
Public Class Class1
    Implements Interface1, Interface2

    Public Function Method1(ByVal V1 As String) As Object _
        Implements Module1.Interface1.Method1
        
        MsgBox(V1)

    End Function

    Public Function Method2(ByVal V1 As String) As Object _ 
        Implements Module1.Interface2.Method2
        
        MsgBox(V1 & vbNewLine & V1)

    End Function

End Class

「こんなんで理解したとか言うな!!(`□´)/」とかって文句は受け付けませんw
俺は俺なりに理解ができて、一つの有効性を発見できたんだからいいんだ!!