VB.NET の Me、MyClass、MyBase 違い、皆さんはご存知ですよね? 先日、講義をやらさせて頂いた時に、MyBase はともかく、Me と MyClass の違いについてご存知の方が意外と少ないという事実を知りました。
違いを実証するためには、以下のようなクラスを書きます。
VB.NET - Me、MyClass、MyBase の違いを実証するための基底クラス
'/** 基底クラス */
Public Class BaseClass
Protected Overridable Function GetString() As String
Return "BaseClass.GetString()"
End Function
' テストとして呼ばれるメソッド
Public Sub BaseClassMethod()
System.Console.WriteLine(Me.GetString())
System.Console.WriteLine(MyClass.GetString())
End Sub
End Class
VB.NET - Me、MyClass、MyBase の違いを実証するための継承クラス
'/** 継承されたクラス */
Public Class ExtendsClass
Inherits BaseClass
' GetString メソッドをオーバーライド
Protected Overrides Function GetString() As String
Return "ExtendsClass.GetString()"
End Function
' テストとして呼ばれるメソッド
Public Sub ExtendsClassMethod()
System.Console.WriteLine(Me.GetString())
System.Console.WriteLine(MyClass.GetString())
System.Console.WriteLine(MyBase.GetString())
End Sub
End Class
では、テスト用のメソッドを呼んでみましょう。
VB.NET - Me、MyClass、MyBase の違いを実証するためのテスト コード
' テスト用のメソッド
Private Shared Sub ExecuteTest()
Dim instance As New ExtendsClass()
instance.ExtendsClassMethod() ' 継承クラスのメソッドを呼び出す
instance.BaseClassMethod() ' 基底クラスのメソッドを呼び出す
End Sub
Me からメンバを呼び出した場合は、呼び出した場所がどこであれインスタンスが示すクラスにあるメソッドを呼び出します。MyClass からメンバを呼び出した場合は、インスタンスの型が何であれ呼び出したクラスにあるメソッドを呼び出します。
説明不要だとは思いますが、MyBase は、そのインスタンスが示す型のひとつ上の基底クラスを指します。今回の場合、ExtendsClass の MyBase は BaseClass になります。
よって、結果は、
VB.NET - ExtendsClassMethod メソッドの呼び出し
- ExtendsClass.GetString()
- ExtendsClass.GetString()
- BaseClass.GetString()
VB.NET - BaseClassMethod メソッドの呼び出し
- ExtendsClass.GetString()
- BaseClass.GetString()
になります。