在VB.net中重载与覆盖

时间:2011-10-24 14:41:41

标签: vb.net

PreviousOther1类的Other2属性有哪些行为差异。

请注意,Previous的重载Other2属性的返回类型已更改为Other2,而Base的{​​{1}}保留为Other1

Public Class Base
    Private _Previous as Base

    Protected Overridable ReadOnly Property Previous As Base
         Get
             Return _Previous 
         End Get
    End Property

    Public Sub New(Previous as Base)
         _Previous = Previous 
    End Sub
End Class

Public Class Other1
    Inherits Base
    Private _Parent as SomeType

    Protected Overrides ReadOnly Property Previous As Base
         Get
             Return _Parent.Previous.Something
         End Get
    End Property

    Public Sub New(Parent as SomeType)
        MyBase.New(Nothing)
        _Parent = Parent 
    End Sub
End Class

Public Class Other2
    Inherits Base
    Private _Parent as SomeType

    Protected Overloads ReadOnly Property Previous As Other2
         Get
             Return _Parent.Previous.Something
         End Get
    End Property

    Public Sub New(Parent as SomeType)
        MyBase.New(Nothing)
        _Parent = Parent 
    End Sub
End Class

3 个答案:

答案 0 :(得分:17)

在我对Jim Wooley's answer发表评论之后,“它看起来像是影响重载的属性。”我在this article看到了光。

因此,Other2类中的Overload更像是遮蔽而不是覆盖。文章中comments中有一个特别具有启发性:

  

之所以产生混淆是因为关键字“Overloads”并不是C#程序员认为传统OO意义上的过载。这是一种特定于VB.Net的隐藏类型。在大多数情况下,您实际上可以将关键字SHADOWS与OVERLOADS交换,并且行为是相同的。不同之处在于您有一个具有多个重载方法签名的基类。如果在具有匹配名称的子类和SHADOWS关键字中声明方法,它将隐藏基类中该方法的每个重载。如果使用OVERLOADS关键字,它只会隐藏具有相同签名的基类方法。

答案 1 :(得分:3)

通常,在提供不同的输入参数时,您将使用Overloads。覆盖取代了该功能。在您的情况下,您希望Over2在Other2而不是Overloads。虽然属性可以采用除值之外的参数,但最好不要提供它们,并在传递其他值时使用方法而不是属性:

Public Class OldMath
   Public Overridable Function DoSomething(val1 As Integer) As Integer
       Return val1 + val1
   End Function
End Class

Public Class NewMath
   Public Overrides Function DoSomething(val1 As Integer) As Integer
      Return val1 * val1
   End Function
   Public Overloads Function DoSomething(val1 As Integer, val2 As Integer) As Integer
      Return val1 * val2
   End Function
End Class

答案 2 :(得分:0)

我在social.msdn.microsoft.com论坛上找到了很好的解释。