Почему я должен использовать перегрузки здесь? - PullRequest
2 голосов
/ 27 мая 2011

Сначала посмотрите на этот пользовательский код 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 at Text в порядке, но я не знаю, почему VS говорит мне, что я не могу использовать свойство Overrides в Image, но я могу использовать Overloads.Зачем?Я думал, Overloads использовать только если есть несколько методов с одинаковым именем (разные параметры).Я до сих пор сомневаюсь в двух вещах:

  1. Почему Image является единственным объявлением свойства в этом классе, но оно должно называться Overloads?
  2. Property неесть какой-либо параметр (конечно), так как же Overloads возможно?

Спасибо за чтение.

Ответы [ 2 ]

4 голосов
/ 27 мая 2011

Поскольку свойство Image в классе ButtonBase не объявлено как Overridable, его нельзя переопределить в производных классах.

Вы можете shadow родительское объявление (то есть скрыть его), повторно обозначив его в производном классе как Shadows или Overloads.Разница между этими двумя довольно мала (§1.15.3 в спецификации языка VB):

  • Shadows тени по имени : если метод (или свойство) объявлен Shadows, тогда он скрывает все методы (или свойства) базового класса с тем же именем.

  • Overloads тени по имени и подписи : скрывает только метод с тем же именем и с такой же подписью.

Вв вашем случае оба результата приводят к одному и тому же, поскольку существует только одно свойство с таким именем.

В любом случае, если родительское свойство не помечено как перезаписываемое, переопределение его в производном классе является плохой идеей- он не будет работать должным образом при доступе к вашему элементу управления через тип базового класса.

1 голос
/ 27 мая 2011

Поскольку в UserControl отсутствует свойство Overidable Image. Если вы хотите объявить его с той же подписью, вам нужно будет использовать ключевое слово Shadows, в свою очередь это может быть Overridable для следующего наследника.

EDIT:

Это признак того, что Автор кнопки думает, что вы должны переопределить изображение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...