Отправляет email-рассылки с помощью сервиса Sendsay

Финансы. Инструкция

  Все выпуски  

Уроки по C# и .NET.


Информационный Канал Subscribe.Ru

C# и .NET. Уроки с сайта http://progs.biz

Рассылка №8

Основы C#. Урок 18. Виртуальные функции.

Полные версии уроков (с картинками) можно найти по адресам
Урок 18. Виртуальные функции.

Основы 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());
        }
    }

С этим уроким все!

Наверх
Рассылки Subscribe.Ru
Уроки по Visual C++ (MFC, платформа .NET)

Уроки по Visual C++.NET, MFC, ActiveX, COM-технологиям. Примеры программ. Каждый урок содержит информацию только по существу и расчитан на 10-20 минут. Уроки по каждой теме независимы.


Copyright Алексеев Игорь, 2002

Copyright сайт progs.biz, 2002



http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное