2013-04-03 34 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

相關問題