首先,请查看此自定义Button继承的UserControl代码:
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
这就是UserControl的所有代码。 Overrides
Text
属性正常,但我不知道为什么VS告诉我我不能在Overrides
属性使用Image
,但我可以使用{{ 1}}。为什么?我认为只有多个方法具有相同名称(不同参数)才会使用Overloads
。我还怀疑两件事:
Overloads
是此类中唯一的属性声明,但必须将其称为Image
?Overloads
没有任何参数(当然),那么Property
怎么可能?感谢阅读。
答案 0 :(得分:4)
由于ButtonBase
类中的Image
property未声明为Overridable
,因此无法在派生类中覆盖它。
您可以通过在导出类中将其重新声明为Shadows
或Overloads
来影子父声明(即隐藏它)。这两者之间的差异相当小(VB语言规范中的§1.15.3):
Shadows
按名称隐藏 :如果声明了方法(或属性)Shadows
,则会影响所有同名的基类方法(或属性)。
Overloads
按名称和签名隐藏 :它只隐藏同名的方法和相同的签名
在您的情况下,两者都会产生相同的结果,因为该名称只有一个属性。
无论哪种方式,如果父属性未标记为可覆盖,则在派生类中重新定义它是一个坏主意 - 当通过其基类类型访问控件时,它将无法正常工作。
答案 1 :(得分:1)
因为UserControl上没有Overidable Image属性。如果您想使用相同的签名声明它,则需要使用Shadows
关键字,对于下一个继承者,这可能会Overridable
。
编辑:
它表示按钮的作者认为你应该覆盖图像。