C# виртуальные методы вопрос

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

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

5 ответов

Решение

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

Нет.

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

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

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

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

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

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

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();метод базового класса не будет вызываться при вызове метода производного класса.

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

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

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

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

Другие вопросы по тегам