2011-05-27 80 views
2

首先,請看看這個自定義按鈕,繼承用戶控件代碼:爲什麼我必須在這裏使用重載?

Public Class UserControl1 

Dim _Text As String 
Dim _Image As Image 

<Browsable(True), Description("Gets or sets the text displayed on the button")> _ 
Overrides Property Text() As String 
    Get 
     Return _Text 
    End Get 
    Set(ByVal value As String) 
     _Text = value 
     MyBase.Text = value 
    End Set 
End Property 

<Browsable(True), Description("Gets or sets the image displayed on the button")> _ 
Overloads Property Image() As Image 
    Get 
     Return _Image 
    End Get 
    Set(ByVal value As Image) 
     _Image = value 
     'ReDrawMe() 
    End Set 
End Property 

End Class 

這就是用戶控件的所有代碼。 OverridesText屬性是好的,但我不知道爲什麼VS告訴我我不能使用OverridesImage財產,但我可以使用Overloads。爲什麼?我認爲Overloads只有在有多個名稱相同(不同參數)的方法時纔會使用。有兩件事情我還懷疑:

  1. 爲什麼Image在這個級別中唯一的財產申報,但必須叫Overloads
  2. Property沒有任何參數(當然),所以Overloads怎麼可能?

感謝您的閱讀。

回答

4

由於ButtonBase類中的Image property未聲明爲Overridable,因此無法在派生類中重寫它。

可以陰影父聲明由派生類重新聲明它作爲ShadowsOverloads(即隱藏)。這兩者之間的區別是相當小(在VB語言規範§1.15.3):

  • Shadows陰影按名稱:如果一個方法(或屬性)聲明Shadows那麼陰影所有基類方法(或屬性)的同名。

  • Overloads陰影按名稱和簽名:隱藏的僅僅是同名相同簽名的方法。

在你的情況下,兩者的結果相同,因爲只有該名稱的單個屬性。無論哪種方式,如果父屬性未標記爲可覆蓋,則在派生類中重新定義它是一個壞主意 - 當通過其基類類型訪問控件時,它將無法正常工作。

+0

如果那麼,爲什麼我們可以使用'Overloads'?它不僅僅用於方法嗎?而且,語言如何區分重載的屬性,因爲它們沒有任何獨特的參數? – 2011-05-27 11:07:16

+0

@ W.N。你*可以*在VB中重載屬性,因爲VB中的屬性(不是在C#中!)可以有參數。爲什麼這裏有可能,我不知道。 – 2011-05-27 11:09:08

+0

@ W.N。是一個特殊的「版本」的方法,封裝了一個getter和setter方法。 – Jodrell 2011-05-27 11:10:15

1

因爲UserControl上沒有Overidable Image屬性。如果您想要使用相同的簽名來聲明它,則需要使用關鍵字Shadows,而下一個繼承者則可能是Overridable

編輯:

其指示該按鈕的作者doesent認爲你應該重寫圖像。

+0

真的嗎?我不認爲重寫Image屬性會導致問題,因爲我們甚至可以重寫OnPaint事件。 – 2011-05-27 11:13:41

+0

@ W.N。我不是'Button'的作者。關於'Image'的實現有什麼特別之處,爲什麼基礎Image不起作用? – Jodrell 2011-05-27 11:16:12

+0

哈哈,有趣(但是,是的,你是對的)答案。順便說一句,謝謝你的回答。 +1投票:)快樂的編碼。 – 2011-05-27 11:17:27

相關問題