ВНИМАНИЕ! Конкурс по программированию!

Проект Programmers.kz и школа hotPen3D2D предлагает Вам курсы по веб-дизайну, веб-программированию и компьютерной графике. Подробности здесь.

 
Информация к новости
 (голосов: 0)

Урок 18. Виртуальные функцииd

Категория: Программирование » C# » Уроки C#

Как показано в уроке 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());
        }
    }

Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Добавление комментария

Имя:*
E-Mail:
Комментарий:
Введите два слова, показанных на изображении: *