有人可以解释这种行为吗?我有两个班级,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
被声明为Foo
类型的对象,所以我原以为调用myFoo.GetVar()
会调用Foo
的{{1}}的实现{1}}(输出2) - 没有明确地向下转发它,我认为GetVar()
实际上是myFoo
的事实因其Bar
声明而“隐身”。为什么会这样?
答案 0 :(得分:0)
想出来。 myFoo.getVar()
在getVar()
指向的对象上调用myFoo
。虽然它知道所述对象是Bar
(并且无法访问Bar
独有的内容,例如myVar2
),但它是仍然是Bar
,它会激活自己的getVar()
函数。
我确定这个行为有一个名字,但我不记得了。任何人?