0

有人可以解释这种行为吗?我有两个班,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被声明为 type 的对象Foo,所以我认为调用myFoo.GetVar()会调用(输出 2)Foo的实现GetVar()- 没有明确地向下转换它,我认为实际上myFoo是 a的事实Bar将是“不可见的”由于它的Foo声明。为什么会这样?

4

1 回答 1

0

弄清楚了。myFoo.getVar()调用指向getVar()的对象。myFoo虽然它不知道所说的对象是 a Bar(并且不能访问专有的东西Bar,例如myVar2),但它仍然是 a Barthat,它会触发它自己的getVar()功能。

我敢肯定这种行为有一个名字,但我不记得了。有接盘侠吗?

于 2013-08-01T12:20:08.123 回答