Ключевое слово VIRTUAL означает, что ЛЮБОЙ класс дочернего уровня МОЖЕТ переопределить данную функцию.
Таким образом, если ни у одного из дочерних классов нет декларации переопределения функции, они все еще будут иметь эту функцию,он просто перейдет к самому верхнему классу сотрудников.
Если, например, вы сделали переопределение только для класса PTSalesPerson, то только класс THAT будет иметь другую функциональность ... Employee и SalesPersonвсе еще работайте с объявлением уровня «Сотрудник» функции / метода.
Помогает ли это вам уточнить?
Как только любой метод объявлен как виртуальный в его родительской иерархии, любой дочерний элемент ВСЕГДА будетВОЗМОЖНО ПЕРЕГРУЗИТЬ от своего родителя независимо от уровня.Но также допустим, что у вас есть уровень иерархии
Class1
Class2 : Class1
Class3 : Class2
Class4 : Class3
, и вы объявляете переопределение в Class3 ... Экземпляр Class4 будет работать на основе родительского элемента IT, который является реализацией вызова метода Class3, а не объявлением Class1.
Теперь, если вы хотите сделать комбинацию, вы всегда можете вызвать базовый метод, а затем сделать больше.
Пример:
Class Employee
{
public decimal MyBonus = 0.0m;
public virtual void CalculateBonus()
{
MyBonus = MySales * .13m;
}
}
class SalesPerson : Employee
{
}
class PTSalesPerson : SalesPerson
{
public override void CalculateBonus()
{
// go do the NORMAL Calculation at the EMPLOYEE Level
base.CalculateBonus();
// Now continue from that... As Part-Time sales person,
// they get 1/4 of that rate. So take whatever the result
// WAS and multiply by .25
MyBonus = MyBonus * .25m;
}
}
Уточнениепри вызове цепочки методов
Согласно вашему комментарию / вопросу, метод, который PTSalesPerson будет переопределять, будет Employees, потому что это следующий объявленный метод в цепочке ... Для теста создайте свои собственные классыкак выше и просто сделать MessageBox.Show («что-то») и посмотреть, что происходит на каждом.Если бы у класса SalesPerson был объявленный метод, то THAT был бы переопределенным, но также вызывался бы «base.CalculateBonus».
Подумайте о «базе».как семейная иерархия.Ты ребенок для своих родителей ... Великий ребенок для своих бабушек и дедушек.Итак, ваша «база».был бы вашим прямым родителем.
ДОПОЛНИТЕЛЬНАЯ ТОЧКА при наследовании
Единственное предупреждение, которое я не раскрыл (спасибо Servy), это объявление расширенных классов, где класс помечен какзапечатанный.Запечатанные классы в основном блокируют класс, поэтому никакие дополнительные производные классы не могут быть выполнены против него.И это применимо ко всему классу ... свойства, методы, функциональность и т. Д.