【问题标题】:MustOverride turns out as a Virtual Method?MustOverride 原来是一个虚拟方法?
【发布时间】:2013-04-03 13:14:37
【问题描述】:

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

【问题讨论】:

  • 这个问题更详细地描述了 MustOverride。 stackoverflow.com/a/1686872/1157215
  • “我仍然可以在一个类型上使用它并且它会返回所有实现的接口”到底是什么意思。您能否提供更多详细信息或示例说明您的意思?
  • 谢谢。你看到了什么你没想到的输出?
  • 我不希望在 MustOverride 方法上看到任何我没有添加任何代码的输出。这些方法在添加代码之前不会失效吗?
  • 你看到了什么 MustOverride 方法?输出仅显示接口,而不是方法。

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


【解决方案1】:

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

【讨论】:

  • 感谢您提供的详细信息。这是否让您怀疑那些 MustOverride 方法的代码是在 RuntimeType 后立即提供的,或者任何派生类是自动创建的?
  • 我不会把它描述为“幕后”,我当然不会说它是“自动的”。 RuntimeType 是 .NET Framework 中的一个真实类,就像任何其他类一样。它派生自基类Type。在RuntimeType 类中,所有MustOverride 方法都被覆盖并指定了它们的实现。如果不是,GetType 函数将无法创建RuntimeType 类的实例。我将用一个重复该行为的示例来更新我的答案。
  • 感谢您澄清这一点。我想我需要复习一下它的代表团。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-24
  • 1970-01-01
  • 2015-06-13
  • 1970-01-01
  • 2013-10-23
  • 2011-10-03
  • 2013-05-01
相关资源
最近更新 更多