在VB.net中重载与覆盖

Dav*_*b60 11 vb.net

Previous属性Other1Other2类的行为差异是什么.

注意,除了超载的返回类型Previous的属性Other2已经改变为Other2同时保持原样BaseOther1.

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
Run Code Online (Sandbox Code Playgroud)

Dav*_*b60 17

在我对Jim Wooley的回答发表评论之后,"它看起来像是影响了超载的财产." 我看到了这篇文章中的亮点.

因此,Other2类中的Overloads 更像是遮蔽而不是覆盖.本文中有一条评论特别具有启发性:

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