在研究 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]
答案 0 :(得分:3)
任何MustOverride
方法都可以在任何类型的实例上调用,因为除非该类提供了所有MustOverride
方法的具体实现,否则您无法创建类的实例。在这种情况下,您的困惑是您假设t
变量引用了Type
对象,但事实并非如此。由于Type
是MustInherit
类,因此无法直接实例化该类型的对象。您只能从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
,您仍然可以调用它,因为对象的实际类型确实实现了它。