2011-10-24 36 views
9

Previous屬性Other1Other2類別的行爲差異是什麼。VB.net中的超載與覆蓋

注比Other2重載Previous屬性的返回類型已更改爲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 

回答

12

我到Jim Wooley's answer評論之一後,「它看起來像它的陰影超載的屬性「。我看到了this article的燈光。

所以,Other2類中的Overloads 的行爲更像是陰影而不是覆蓋。有文章認爲是特別有啓發的comments之一:

產生了困惑,因爲關鍵詞「重載」是不是一個C#程序員認爲在傳統的面向對象意義上的過載。這是一種特定於VB.Net的隱藏類型。在大多數情況下,您實際上可以將關鍵字SHADOWS與OVERLOADS交換,並且行爲相同。不同之處在於,您擁有包含多個重載方法簽名的基類時。如果在名稱匹配的子類中聲明一個方法,並且SHADOWS關鍵字將在基類中隱藏該方法的每個重載。如果您使用OVERLOADS關鍵字,它將只隱藏具有相同簽名的基類方法。

+0

「Shadows」關鍵字的聲音很容易變成嚴重違反LSP的情況。 – Panzercrisis

2

通常,當您提供不同的輸入參數時,您會使用Overloads。覆蓋取代了功能。在你的情況下,你希望覆蓋Other2而不是超載。雖然性能可能會比值等參數,最好是不提供給他們,並傳遞其他值時使用的方法,而不是屬性:

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 
+0

我明白,但重載允許將返回類型修改爲Other2,當引用時聲明爲Base類型時,它的行爲是否與Overridden Proprety類似? – DavRob60

+0

覆蓋也可用於添加重寫方法之外的功能。很多時候,你會看到一個方法覆蓋一個基本方法,但仍然會調用它,因爲它只需要爲繼承類添加一些東西。 – Yatrix

+0

@ DavRob60您不能重載返回類型,只能輸入參數。如果您的輸入參數不同,而您的返回類型不同,那麼將會根據調用參數的最佳匹配使用縮小約定來確定最佳匹配。 –