Основы 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());
}
}
С этим уроким
все! |