クラスを扱う時に、外側からあたかも別の型のように扱う事ができるように定義するのがインタフェースです。複数の別のクラスに同じ性質を持たせ、統一的に扱いたい時に便利です。
例)
クラス A と クラス B が共通のインタフェース II 型を持っていると、クラス A と クラス B を、インタフェース II 型として、For Each などで取り扱う事ができます。
Option Strict On
Public Class Form1
Private Interface II
Function Say() As String
End Interface
Private Class A
Implements II
Public Function Say() As String Implements II.Say
Return "Yes"
End Function
End Class
Private Class B
Implements II
Public Function Say() As String Implements II.Say
Return "No"
End Function
End Class
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim objs As II() = New II() {New A(), New B()}
For Each obj As II In objs
MsgBox(obj.Say())
Next
End Sub
End Class
上記例では、インタフェース型の配列 objs を定義していますが、
Dim objs As II() = New II() {New A(), New B()}
配列要素の実体はクラス A とクラス B です。
しかし、あくまでインタフェース型として扱うので、インタフェース型の Say メソッドを For Each で共通的に呼び出す事ができます。
クラス A と クラス B がインタフェース型を持っていない場合には、次のようなコードになるでしょう。
Option Strict On
Public Class Form2
Private Class A
Public Function Say() As String
Return "Yes"
End Function
End Class
Private Class B
Public Function Say() As String
Return "No"
End Function
End Class
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim objs As Object() = New Object() {New A(), New B()}
For Each obj As Object In objs
If TypeOf obj Is A Then
MsgBox(DirectCast(obj, A).Say()) 'あくまでクラス A として扱う
ElseIf TypeOf obj Is B Then
MsgBox(DirectCast(obj, B).Say()) 'あくまでクラス B として扱う
End If
Next
End Sub
End Class
お礼
ありがとうございます! 夏でPCが壊れました・・・返事が遅れてすみませんでした!!