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
俺は俺なりに理解ができて、一つの有効性を発見できたんだからいいんだ!!