C # виртуальные методы вопрос - PullRequest
2 голосов
/ 07 июля 2010

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

Потому что, когда я использую открытый метод переопределения WinForm OnPaint, в его теле base.OnPaint (д) называется.Я не понимаю, я думал, что виртуальные методы переопределяют оригинальные.Если это обычно не называется, почему это называется в этом случае?Спасибо

Ответы [ 5 ]

11 голосов
/ 07 июля 2010

Нет, он не вызывается, если вы не вызываете его явно из производного класса.

5 голосов
/ 07 июля 2010

при вызове виртуального метода Базовый метод также называется?

номер

Потому что, когда я использую публичное переопределение OnPaint (), в его основной базе. OnPaint (e) называется. Я не понимаю это я мысль виртуальные методы отменяет оригинал.

Разработчик решил вызвать base.OnPaint (e) , а также сделать что-то еще . Другими словами, базовая реализация - это то, что у вас есть под рукой, на случай, если она вам пригодится - вы можете позвонить ей, а затем выполнить дополнительную конкретную работу.

Если бы тело функции было только вызовом базы, то это было бы эквивалентно тому, чтобы вообще не писать переопределяющую функцию.

1 голос
/ 07 июля 2010

Я понимаю, что когда вы говорите "виртуальный метод вызывается", вы подразумеваете переопределение метода.

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

class Base
{
  public virtual void VirtualMethod()
  {
    // Insert code here
  }
}

class Derived : Base
{
  public override void VirtualMethod()
  {
    // Insert code here
    base.VirtualMethod(); // Explicit call to the base class method
  }
}

Если бы мы не включили инструкцию base.VirtualMethod();, метод базового класса не был бы вызван при вызове метода производного класса.

0 голосов
/ 07 июля 2010

Иногда у вас есть код в «базовом» методе, который полезен независимо от того, какой дочерний метод выполняется, тогда дочерние элементы могут просто вызывать базовый метод, но это необязательно.

Если вы специально не вызываетебазовый метод, дочерний метод вызывается вместо базового, а не "а также".

0 голосов
/ 07 июля 2010

при вызове виртуального метода Базовый метод также называется?

Это зависит от того, вызываете ли вы base.XXX в переопределенном методе или нет.

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