【问题标题】:Why I must use Overloads here?为什么我必须在这里使用重载?
【发布时间】:2011-09-03 07:48:50
【问题描述】:

首先,请看这个自定义的 Button-inherited 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 属性的 Overrides 还可以,但我不知道为什么 VS 告诉我我不能在 Image 属性中使用 Overrides,但我可以使用 Overloads。为什么?我认为Overloads 仅在有多个具有相同名称(不同参数)的方法时使用。我仍然怀疑两件事:

  1. 为什么Image是这个类中唯一的属性声明,却必须叫Overloads?
  2. Property 没有任何参数(当然),那么Overloads 怎么可能呢?

感谢阅读。

【问题讨论】:

    标签: .net vb.net oop overriding


    【解决方案1】:

    因为ButtonBase 类中的Image property 未声明为Overridable,所以不能在派生类中覆盖它。

    您可以隐藏父声明(即隐藏它),方法是在派生类中将其重新声明为Shadows 或Overloads。这两者之间的差异很小(VB 语言规范中的第 1.15.3 节):

    • Shadows 隐藏按名称:如果声明了一个方法(或属性)Shadows,那么它会隐藏所有同名的基类方法(或属性)。

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

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

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

    【讨论】:

    • 如果是这样,为什么我们可以使用Overloads?它不是仅用于方法吗?语言如何区分重载属性,因为它们没有任何唯一参数?
    • @W.N.您可以在 VB 中重载属性,因为 VB(不是 C#!)中的属性可以有参数。为什么会在这里,我不知道。
    • @W.N.是封装了 getter 和/或 setter 方法的方法的特殊“版本”。
    • @Konrad Rudolph:我看到了您编辑的答案。但是我不太了解Shadows,它使我继承的属性无法正常工作,所以我总是对我的用户控件使用覆盖。
    • @W.N.我在 VB 规范中查找了它,并发现了为什么 Overloads 在这里工作。查看更新的答案。
    【解决方案2】:

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

    编辑:

    这表明按钮的作者认为您应该覆盖图像。

    【讨论】:

    • 真的吗?我不认为覆盖 Image 属性会导致问题,因为我们甚至可以覆盖 OnPaint 事件。
    • @W.N.我不是Button 的作者。你对Image的实现有什么特别之处,为什么基础Image不起作用?
    • 大声笑,有趣(但是,是的,你是对的)答案。顺便说一句,谢谢你的回答。 +1 票 :) 编码愉快。
    • 当用户为 Image 属性设置数据时,我还需要做一些其他事情,所以我必须覆盖它。
    猜你喜欢
    • 1970-01-01
    • 2012-05-12
    • 2014-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-11
    相关资源
    最近更新 更多