メソッド定義に対するnew/Shadowsキーワード

http://www.atmarkit.co.jp/fdotnet/vb6tonet/vb6tonet10/vb6tonet10_02.html
C#/VB.NETの継承先のクラスで、継承元から継承したメソッドの動作を置き換えるためのキーワード。
オーバーライド(virtual/overridable)と似ているが、以下の点が異なる。
・オーバーライドされたメソッドは、『インスタンスの型』によって、呼び出されるメソッドが変化する
・new/Shadowsされたメソッドは、『インスタンスの参照に使っている変数の型』によって、呼び出されるメソッドが変化する
・new/Shadowsされたメソッドは、継承元のメソッドの引数・戻り値に関係なく、自由なオーバーロードが許される



具体的には、以下のコードによって示されるように動作する。

Private Sub Main()
  Dim o1 As New Class1()
  Dim o2 As New Class2()
  o1.Test()     ' Test in Class1 called
  o2.Test()     ' Test in Class2 called

  Dim o3 As Class1 = New Class2()
  o3.Test()     ' Test in Class1 called ●ここがオーバーライドと違う。
End Sub

Public Class Class1
  Public Sub Test()
    Trace.WriteLine("Test in Class1 called")
  End Sub
End Class

Public Class Class2
  Inherits Class1
  Public Shadows Sub Test()
    Trace.WriteLine("Test in Class2 called")
  End Sub
End Class