0

誰かがこの振る舞いを説明できますか? 私は2つのクラスを持っていFooますBar. その機能Barを継承Fooしてオーバーライドします。GetVar

Public Class Foo
    Public myVar1 As Integer

    Public Overridable Function GetVar() As Integer
        Console.WriteLine("Foo.GetVar!()")
        Return myVar1
    End Function
End Class

Public Class Bar
    Inherits Foo

    Public myVar2 As Integer

    Public Overrides Function GetVar() As Integer
        Console.WriteLine("Bar.GetVar!()")
        Return MyBase.GetVar() + myVar2
    End Function

End Class

私のmain()モジュールでは、次のことが起こります。

Sub Main()
    Dim myBar As New Bar
    myBar.myVar1 = 2
    myBar.myVar2 = 2

    Dim myFoo As Foo
    myFoo = myBar

    Console.WriteLine(myFoo.GetVar())

    Console.ReadKey()
End Sub

出力は次のとおりです。

Bar.GetVar()!
Foo.GetVar()!
4

私には奇妙に思えます -myFooはタイプ のオブジェクトとして宣言されているので、呼び出すとの実装(outputting 2)が呼び出されるFooと思っていました- 明示的にダウンキャストせずに、実際に aであるという事実は「見えない」と思いましたその宣言による。なぜこうなった?myFoo.GetVar()FooGetVar()myFooBarFoo

4

1 に答える 1