MustOverride是虚拟方法吗?

时间:2013-04-03 13:14:38

标签: vb.net syntax override .net-assembly abstract-methods

在研究 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]

1 个答案:

答案 0 :(得分:3)

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

例如,请考虑这个复制行为的示例:

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,您仍然可以调用它,因为对象的实际类型确实实现了它。