Помогите с переопределением C# .NET

Мне нужно переопределить Tabcontrol GetTabRect.

  protected override Rectangle GetTabRect(int index)
    {...}

я получаю эту ошибку

Ошибка 1 «TabControl.GetTabRect (int)»: невозможно изменить модификаторы доступа при переопределении «общедоступного» унаследованного члена «System.Windows.Forms.TabControl.GetTabRect (int)»

Error2 'TabControl.GetTabRect (int)': не может переопределить унаследованный член «System.Windows.Forms.TabControl.GetTabRect (int)», поскольку он не помечен как виртуальный, абстрактный или переопределенный.

Как я могу это сделать?

РЕДАКТИРОВАТЬ

если я использую общественность:

TabControl.GetTabRect(int)': cannot override inherited member 'System.Windows.Forms.TabControl.GetTabRect(int)' because it is not marked virtual, abstract, or override

person Ste    schedule 30.03.2011    source источник
comment
Метод не помечен как virtual, поэтому вы не можете его переопределить (независимо от модификаторов доступа).   -  person BrokenGlass    schedule 31.03.2011
comment
@Ste: это не должно было быть переопределено   -  person BrokenGlass    schedule 31.03.2011
comment
Разве он не мог использовать общедоступный новый Rectangle GetTabRect(int index)?   -  person RoflcoptrException    schedule 31.03.2011
comment
@Roflcoptr: это скрывает метод базового класса, но не переопределяет его — это означает, что если вы обращаетесь к его классу со ссылкой, введенной в базовый класс, метод базового класса еще бы исполнить.   -  person BrokenGlass    schedule 31.03.2011


Ответы (4)


Метод TabControl.GetTabRect() является общедоступным и не виртуальным, поэтому вам может потребоваться найти другое решение проблемы, которую вы пытаетесь решить. Даже если вы переопределите этот метод с помощью ключевого слова new, базовый класс все равно не будет вызывать вашу реализацию, потому что это не виртуальная функция.

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

Что вы пытаетесь сделать, для чего нужен переопределенный метод GetTabRect()?

person xxbbcc    schedule 30.03.2011

Метод общедоступный. Таким образом, вы не можете сделать его защищенным, когда переопределяете его. Таким образом, вы должны сохранить видимость общественности.

Это должно выглядеть так:

public override Rectangle GetTabRect(int index)
person RoflcoptrException    schedule 30.03.2011
comment
+1, конечно, и если говорить о коде, это означает наличие public override Rectangle GetTabRect(int index) - person Shadow Wizard Wearing Mask V2; 31.03.2011
comment
ура, нужно помнить, что очевидные вещи не очевидны для всех. :-) - person Shadow Wizard Wearing Mask V2; 31.03.2011

Проблема в том, что вы эффективно скрываете функцию своим переопределением. Вам необходимо сохранить public природу функции, поскольку вы не можете изменить подпись при переопределении метода.

person Aren    schedule 30.03.2011

В полученном сообщении об ошибке четко указано, что вы не можете ограничить/изменить доступ при переопределении метода. Вы можете переопределить его как Public. Есть ли конкретная причина, по которой вы хотите, чтобы ваш GetTabRect был защищен?

person Sabitha    schedule 30.03.2011