2013-04-03 2 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, но это не так. Поскольку 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, вы все равно можете его вызвать, потому что фактический тип объекта реализует его.

+0

Благодарим вас за деталь. Вы подозреваете, что код для этих методов MustOverride предоставляется «за кулисами», как только автоматически создается RuntimeType или любой производный класс? – Ccorock

+1

Я бы не назвал это «за кулисами», и я, конечно же, не сказал бы, что это «автоматический». «RuntimeType» является реальным классом в .NET Framework, как и любой другой класс. Он происходит от базового класса «Тип». В классе «RuntimeType» все методы «MustOverride» переопределяются и их реализация задается. Если бы они не были, функция «GetType» не могла бы создать экземпляр класса «RuntimeType».Я обновляю свой ответ на примере, который дублирует поведение. –

+1

Благодарим вас за это. Я полагаю, что его делегацию мне нужно освежить. – Ccorock

Смежные вопросы