2010-07-07 2 views
2

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

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

+0

Если вы хотите убедиться, что базовый метод вызывается переопределением, см. Http://stackoverflow.com/questions/2872137/does-this-keyword-exist-when-an-overriding-method-needs -to-call-the-parent/2872190 # 2872190 или «шаблонный метод» http://en.wikipedia.org/wiki/Template_method_pattern или «не виртуальный интерфейс» http: // ru.csharp-online.net/CSharp_Canonical_Forms%E2%80%94NVI_Pattern patterns –

ответ

5

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

Номер

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

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

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

+0

Хмм ... стандартный метод WinForm OnPaint. Вызывается ли это потому, что база содержит некоторые графические подпрограммы низкого уровня, которые на самом деле рисуются? – Snake

+0

@Snake: Ваш комментарий очень специфичен для реализации одной функции. Я не знаю, почему база всегда называется, но я могу догадаться, что есть что-то общее, что всегда нужно делать. –

+0

Для метода OnPaint вполне вероятно, что ваш код рисует что-то «сверху» графического представления по умолчанию. Вот почему базовая реализация OnPaint может быть вызвана: рисовать фон и т. Д. –

11

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

0

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

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

0

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

Если вы конкретно не вызвали базовый метод, дочерний метод вызывается вместо базы, а не «как и».

1

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

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

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

Смежные вопросы