|
Как показано в уроке 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()); } }
Источник: |
Категория: С# | Добавил: Sumrak (14.11.2010)
| Автор: E W
|
Просмотров: 2415 | Комментарии: 0
| Теги:
| Рейтинг: 5.0/2 |
|
|
|