首页 > 解决方案 > 如何确定 ME 的参考类型?

问题描述

问题:

在下面的代码中,d.UseMe()执行 Me.testShadow() 的 O/P 在我看来应该是“Shadowing Procedure: From the Derived Class”。但相反,我得到的 O/P 是“来自基类:派生类中的影子过程”。我就为什么我认为应该输出前者提出我的理解。请告诉我哪里出错了。

  1. d 是指向派生类型对象的派生类类型引用。
  2. d.UseMe() 在其中执行语句 Me.testShadow()。ME 的行为类似于指向当前实例的对象变量,即“d”指向的对象。因此,ME 的引用属于派生类类型。
  3. testShadow() 有两个版本,一个在基类中,一个在派生类中的阴影版本。
  4. 由于 SHADOWS 对引用起作用,并且由于 ME 引用的类型是派生类类型,我期待派生类中的阴影函数会被调用?相反,正在调用基类中的 testShadow()。

我错在哪里?我写的代码如下:

Module Module1
    Sub Main()
        Dim b As New base()
        Dim d As New derived()
        d.useMe()
        Console.ReadLine()
    End Sub
End Module

Public Class base
    Public Overridable Function testOverride() As String
        Return "Overrideable function: From the base Class"
    End Function
    Public Function testShadow() As String
        Return "From Base class. Shadowing function in inherited class"
    End Function
    Public Sub useMe()
        Console.WriteLine("Me.testOverride() returns: {0}", Me.testOverride())
        Console.WriteLine("Me.testShadow() returns: {0}", Me.testShadow)
    End Sub
End Class

Public Class derived : Inherits base
    Public Overrides Function testOverride() As String
        Return "Overriden procedure: From derived class"
    End Function
    Public Shadows Function testShadow() As String
        Return "Shadowing procedure: From derived class"
    End Function
End Class

标签: vb.net

解决方案


覆盖遵循对象的类型,而遮蔽遵循引用的类型。该useMe方法位于基类中,并且Me始终是使用它的类的类型,基类也是如此Me。这意味着Me.testShadow将执行基类中的方法。

您可以通过考虑它位于可以在任意数量的派生类型中继承的基类这一事实轻松地向自己证明它Me是类型。base引用的类型如何Me根据您调用该方法的派生类型而改变?引用不会在运行时更改类型。它们始终是编译代码时的任何类型。该useMe方法是在base类中编写的,因此它是类型base并且将始终是该类型。


推荐阅读