声明为父类的对象调用子类方法

时间:2013-08-01 10:06:18

标签: inheritance override vb.net-2010

有人可以解释这种行为吗?我有两个班级,FooBarBar继承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被声明为Foo类型的对象,所以我原以为调用myFoo.GetVar()会调用Foo的{​​{1}}的实现{1}}(输出2) - 没有明确地向下转发它,我认为GetVar()实际上是myFoo的事实因其Bar声明而“隐身”。为什么会这样?

1 个答案:

答案 0 :(得分:0)

想出来。 myFoo.getVar()getVar()指向的对象上调用myFoo。虽然它知道所述对象是Bar(并且无法访问Bar独有的内容,例如myVar2),但它是仍然是Bar,它会激活自己的getVar()函数。

我确定这个行为有一个名字,但我不记得了。任何人?