Виртуальные функции
Конструктор сайтов - uCoz
Меню сайта


Поиск по сайту
Loading


Форма входа


Помощь проекту

PayPal:

LiqPay or Credit/Debit Card:

W1 "Единый кошелек":
199990419310
WebMoney:
WME - E509190786817
WMZ - Z195499640086
WMU - U204403357554
WMR - R280087882619




Активные темы

  • Все вопросы касающиеся Neil Scope (6423)
  • Продам плату Neil Scope 3 rev 3.2 (1)
  • Заказ плат под NeilScope3 (12.2015) (59)
  • Первое знакомство с микроконтроллерами Silabs (105)
  • инвертор на микропроцессоре с 12\220v с синусом на выходе (2)
  • Куплю плату NS-3 (0)
  • Подскажите (0)
  • Осваиваем LPC2478... (1)
  • Мелкие вопросы по МК51 от SiLabs-a.. (40)
  • Детали для Neil Scope 2 (0)



  • Статистика

    Онлайн всего: 1
    Гостей: 1
    Пользователей: 0



    Рекомендуемые браузеры: Mozzilla, Google Chrome






    Приветствую Вас, Пробегающий мимо · RSS 22.09.2017, 04:31

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

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