1

在研究Assembly.GetInterfaces()时,我发现该方法是MustOverride 方法。在我看来,这意味着它对派生类没有默认操作。它基本上只是一个签名,一个抽象方法。然而,我仍然可以在一个类型上使用它,它会返回所有实现的接口,而无需为 MustOverride 方法编写任何代码。

进入 MustOverride 方法的这段代码在哪里?我是否只是通过在创建的类型上调用方法以某种方式间接覆盖了它?

这个问题纯粹是基于研究和发现,除了理解语言的范围之外,我并没有试图做任何事情。

这是我使用的代码:

Public Class Form1

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        Dim t As Type

        Debug.WriteLine(GetType(Integer))
        t = GetType(Integer)
        Dim interfaceArr As Type() = t.GetInterfaces

        For i As Integer = 0 To interfaceArr.Length - 1
            Debug.WriteLine(interfaceArr(i))
        Next

    End Sub

End Class


Output Is:

System.IComparable
System.IFormattable
System.IConvertible
System.IComparable 1[System.Int32]
System.IEquatable 1[System.Int32]
4

1 回答 1

3

任何MustOverride方法总是可以在任何类型的实例上调用,因为除非该类提供所有方法的具体实现,否则您不可能创建类的实例MustOverride。在这种情况下,您的困惑是您假设t变量正在引用一个Type对象,但事实并非如此。由于Type是一个MustInherit类,因此不可能直接实例化该类型的对象。您只能实例化派生Type. 如果您使用调试器检查T变量,您会注意到它实际上是在引用该类的一个实例,RuntimeType该类显然是从Type.

例如,考虑这个重复行为的例子:

Public Class Form1
    Public MustInherit Class BaseClass
        Public MustOverride Function GetGreeting() As String
    End Class

    Public Class DerivedClass
        Inherits BaseClass

        Public Overrides Function GetGreeting() As String
            Return "Hello world"
        End Function
    End Class

    Public Function GetInstance() As BaseClass
        Return New DerivedClass()
    End Function

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim t As BaseClass = GetInstance()
        Debug.WriteLine(t.GetGreeting())
    End Sub
End Class

如您所见,t变量属于BaseClass类型,但它实际上是在引用一个DerivedClass对象。因此,即使BaseClass类将方法定义为MustOverride,您仍然可以调用它,因为对象的实际类型确实实现了它。

于 2013-04-03T13:37:49.993 回答