为什么我必须在这里使用Overloads?

时间:2011-05-27 11:00:36

标签: .net vb.net oop overrides

首先,请查看此自定义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。我还怀疑两件事:

  1. 为什么Overloads是此类中唯一的属性声明,但必须将其称为Image
  2. Overloads没有任何参数(当然),那么Property怎么可能?
  3. 感谢阅读。

2 个答案:

答案 0 :(得分:4)

由于ButtonBase类中的Image property未声明为Overridable,因此无法在派生类中覆盖它。

您可以通过在导出类中将其重新声明为ShadowsOverloads影子父声明(即隐藏它)。这两者之间的差异相当小(VB语言规范中的§1.15.3):

  • Shadows 按名称隐藏 :如果声明了方法(或属性)Shadows,则会影响所有同名的基类方法(或属性)。

  • Overloads 按名称和签名隐藏 :它只隐藏同名的方法相同的签名

在您的情况下,两者都会产生相同的结果,因为该名称只有一个属性。

无论哪种方式,如果父属性未标记为可覆盖,则在派生类中重新定义它是一个坏主意 - 当通过其基类类型访问控件时,它将无法正常工作。

答案 1 :(得分:1)

因为UserControl上没有Overidable Image属性。如果您想使用相同的签名声明它,则需要使用Shadows关键字,对于下一个继承者,这可能会Overridable

编辑:

它表示按钮的作者认为你应该覆盖图像。