Public Class TheBase
Public Overridable Sub a()
Debug.Writeline("TheBase")
End Sub
End Class
Public Class TheInherited
Inherits TheBase
Public Overrides Sub a()
Debug.Writeline("TheInherited")
End Sub
End Class
Public Class TheShadowed
Inherits TheInherited
Public Shadows Sub a()
Debug.Writeline("TheShadowed")
End Sub
End Class
'情况一:
Dim c As TheBase
c = New TheBase()
c.a() ' 输出 TheBase
c = New TheInherited()
c.a() ' 输出 TheInherited
c = New TheShadowed()
c.a() ' 输出 TheInherited
'情况二:
Dim c As TheInherited
c = New TheBase()
c.a() ' 错误!无效的转换。
c = New TheInherited()
c.a() ' 输出 TheInherited
c = New TheShadowed()
c.a() ' 输出 TheInherited
'情况三:
Dim c As TheShadowed
c = New TheBase()
c.a() ' 错误!无效的转换。
c = New TheInherited()
c.a() ' 错误!无效的转换。
c = New TheShadowed()
c.a() ' 输出 TheShadowed
对于TheShadowed来说,情况稍微复杂一点:
由于TheShadowed里面所写的那个a()被声明为Shadows的,也就是说这个a()跟TheBase和TheInherited里面的没有关系,于是从变量c的基类(TheBase)开始找,一直找到变量所指对象的类型TheShadowed,发现变量c的类型(无论是TheBase还是TheInherited)里面的那个a()最后一次被重写是在TheInherited里面(注意:TheShadows里面的a()跟它没关系),于是只要c不是Dim .. As TheShadows,那么就会选择调用TheInherited里面的a()了。