Основы C#. Урок 18. Виртуальные функции
Как показано в уроке 13
переменная базового класса может использоваться для хранения переменних
производных классов. Но при этом мы не сможем использовать методы из
производного класса. Сайчас мы с вами и посмотрим, как эту неприятность
можно обойти. Для этого как раз и служит механизм виртуальных функций.
Если в родительском классе некоторая функция объявлена как
виртуальная, то в производном классе ее можно переопределить. В этом,
собственно говоря, ничего нового нет - этомы могли делать и без всяких
виртуальных функций. Новое заключается в том, что если мы запишем в
переменную типа родительского класса экземпляр проиводного, то для
такого экземпляра мы сможем вызывать переопределенную функцию
производного класса. Вот пример, поясняющий это:
using System;
namespace test
{
//Класс Worker
class Worker
{
protected int age=0;
virtual public void setAge(int age)
{
if(age>0 && age<100)
this.age=age;
else
this.age=0;
}
public int getAge()
{
return age;
}
}
//Класс Boss
class Boss : Worker
{
public int numOfWorkers; //Количество подчиненных
override public void setAge(int age)
{
if(age>0 && age<45)
this.age=age;
else
this.age=0;
}
}
class Test
{
static void Main(string[] args)
{
Worker boss = new Boss();
boss.setAge(50);
Console.WriteLine("Возраст босса "+boss.getAge());
}
}
}
Как вы видите, тут функцию setAge в родительском классе Worker мы
определили с ключевым словом virtual, а одноименную функцию в
производном классе Boss - с ключевым словом ovеrride.
Обратите внимание на то, что из какого конкретно класса вызывается
функция (из родительского или производного) определяется на этапе
выполнения программы, а не на этапе компиляции. В принципе в переменную
родительского типа мы могли бы записать экземпляр именно родительского
класса. В этом случае, естественно, вызвалась бы функция родительского
класса. Вот поясняющий это утверждение пример:
class Test
{
static void Main(string[] args)
{
Worker boss;
bool b;
//Присваиваем значение в переменную b
...
if(b)
{
//В переменной boss - экземпляр класса Boss
boss=new Boss();
}
else
{
//В переменной boss - экземпляр класса Worker
boss=new Worker();
}
//Вызываем метод класса Boss или Worker
boss.setAge(50);
Console.WriteLine("Возраст "+boss.getAge());
}
}
С этим уроким все!
|