2011-05-27 93 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

相关问题