Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Основы C#.doc
Скачиваний:
58
Добавлен:
10.02.2015
Размер:
430.59 Кб
Скачать

Основы c#. Урок 17. Область видимости

Переменные существуют только в своей области видимости, при выходе из которой переменная "умирает". Область видимости переменной в первом приближении начинается в строке, где переменная объявлена и кончается на закрывающей фигурной скобке (переменная должна быть объявлена между этой скобкой и парной к ней открывающей). Вот поясняющий пример:

intk=3;

//Все OK, переменая k видна

Console.WriteLine(k);

Тут значение переменной k доступно и выведется на экран.

...

{

intk=3;

}

//Переменая k не видна

Console.WriteLine(k); //Ошибка!

В этом же примере вывести k на экран не получится - она умерла на закрывающей фигурной скобке.

Во вложенных областях видимости мы, как правило, не можем объявлять переменные с одинаковыми именами:

int k=4;

{

//Ошибка!

int k=3;

}

Исключение составляют параметры в методах класса:

class Vector

{

float x, y; //Координаты

...

public Vector(float x, float y)

{

this.x=x;

this.y=y;

}

Здесь мы имеем две пары одноименных переменных - x в параметре конструктора и x как переменная класса. Так как для уточнения переменной класса мы можем использовать this, то ошибки не будет.

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

Как показано в уроке 13переменная базового класса может использоваться для хранения переменних производных классов. Но при этом мы не сможем использовать методы из производного класса. Сайчас мы с вами и посмотрим, как эту неприятность можно обойти. Для этого как раз и служит механизм виртуальных функций.

Если в родительском классе некоторая функция объявлена как виртуальная, то в производном классе ее можно переопределить. В этом, собственно говоря, ничего нового нет - этомы могли делать и без всяких виртуальных функций. Новое заключается в том, что если мы запишем в переменную типа родительского класса экземпляр проиводного, то для такого экземпляра мы сможем вызывать переопределенную функцию производного класса. Вот пример, поясняющий это:

usingSystem;

namespacetest

{

//Класс 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

{

publicintnumOfWorkers;//Количество подчиненных

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());

}

}

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