Четверг, 21.11.2024, 22:32

  Сайт проекта StreamLive 3.140.197.140

Вы вошли как Гость | Группа "Гости" | RSS

Меню

Категории
С# [55]
VB.net [0]
VB6 [1]

Реклама

Nothing

 
Главная » Статьи » Программирование » С# [ Добавить статью ]
Виртуальные функции
Как показано в уроке 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
Всего комментариев: 0

Log in

Block title

Copyright sumrak © 2024