2013-04-03 36 views
1

在研究Assembly.GetInterfaces()时,我发现该方法是一个MustOverride方法。我的理解意味着它对派生类没有默认操作。它只是一个基本的签名,一个抽象的方法。然而,我仍然可以在类型上使用它,它将返回所有实现的接口,而不必为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] 
+0

这个问题更详细地描述了MustOverride。 http://stackoverflow.com/a/1686872/1157215 – Ccorock

+0

你究竟是什么意思,“我仍然可以在一个类型上使用它,它会返回所有实现的接口”。你能提供更多细节或你的意思吗? –

+0

谢谢。你看到了哪些你不期望看到的输出? –

回答

3

任何MustOverride方法总是可以在任何类型的实例来调用,因为除非类提供的具体实现,你不可能创建一个类的实例所有的MustOverride方法。在这种情况下,您的困惑是您认为t变量引用了Type对象,但情况并非如此。由于TypeMustInherit类,因此不可能直接实例化该类型的对象。你只能实例化一个类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,仍然可以调用它,因为该对象的实际类型确实可以实现它。

+0

谢谢你的细节。这是否会让您怀疑这些MustOverride方法的代码是在RuntimeType或任何派生类自动创建后“在幕后”提供的? – Ccorock

+1

我不会将其描述为“幕后”,我当然不会说它是“自动”的。 RuntimeType是.NET Framework中的一个真正的类,就像任何其他类一样。它来自基类'Type'类。在RuntimeType类中,所有MustOverride方法都被覆盖,并且指定了它们的实现。如果它们不是,'GetType'函数将无法创建'RuntimeType'类的实例。我会用一个重复行为的例子来更新我的答案。 –

+1

感谢您解决这个问题。我想它的代表团我需要提一下。 – Ccorock

相关问题