Previous
和Other1
类的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
答案 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论坛上找到了很好的解释。