Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Экзамен в гаи redacted.doc
Скачиваний:
5
Добавлен:
27.09.2019
Размер:
676.35 Кб
Скачать

3. Что будет выведено на экран в каждом из случаев, приведенных ниже:

А)

try {

Console.WriteLine("Hello ");

Thread.CurrentThread.Abort();

}

finally { Console.WriteLine("Goodbye "); }

Console.WriteLine("world!");

Ответ: Hello Goodbye. Abort выбрасывает исключение ThreadAbortException, которое обрабатывается finally, затем выполнение прерывается.

Б)

try {

Console.WriteLine("Hello ");

System.Environment.Exit(0);

}

finally { Console.WriteLine("Goodbye "); }

Console.WriteLine("world!");

Ответ: Hello. Выполнение программы прерывается в точке вызова System.Environment.Exit(0) и управление передается ОС.

Экзаменационный билет №5

1. Понятие полиморфизма

Полиморфизм – способность родственных (то есть имеющих общий родительский класс) объектов решать схожие по смыслу проблемы разными способами. Для этого в каждом классе-потомке следует переопределить нужный родительский метод. Например, для классов Circle, Line или Rectangle, являющихся наследниками класса GeomethricShape, следует переопределить родительский метод Draw(), ответственный за отрисовку фигур, чтобы нарисовать, соответственно, окружность, линию или прямоугольник.

2. Перегрузка функций. Алгоритм выбора перегруженной функции.

Механизм перегрузки функций (function overloading) позволяет создавать функции, имеющие одинаковое имя, но работающие с разными типами параметров. Рассмотрим функцию MaxValue():

class Program {

static int MaxValue (int [ ] intArray) {

int maxVal = intArray[0];

for (int i = 1; i < intArray.Length; i++) {

if (intArray[i] > maxVal) maxVal = intArray[i];

}

return maxVal;

}

static void Main(string[] args) {

int [ ] myArray = {1, 8, 3, 6, 2, 5, 9, 3, 0, 2};

int maxVal = MaxValue(myArray) ;

Console.WriteLine("The maximum value in myArray is {0}", maxVal);

// Вывод максимального значения в массиве myArray

Console.ReadKey() ;

}

}

Эта функция могла использоваться только с массивами значений int. Для работы с другими типами параметров можно было бы либо предоставить соответствующие функции с другими именами, т.е., например, изменить имя на IntArrayMaxValue() и предоставить функции с именами вроде DoubleArrayMaxValue() для обработки дру­гих типов, либо добавить в код следующую функцию:

static double MaxValue(double [ ] doubleArray) {

double maxVal = doubleArray[0];

for (int i = 1; i < doubleArray.Length; i++)

{

if (doubleArray [i] > maxVal) maxVal = doubleArray[i];

}

return maxVal;

}

Единственное отличие здесь связано с применением значений double. Имя функ­ции – MaxValue() – выглядит точно так же, но вот её сигнатура выглядит по-другому. Определение двух функций с одинаковыми сигнатурами было бы ошибкой, но благодаря тому, что эти две функции имеют разные сигнатуры, никакой ошибки здесь нет.

Возвращаемый тип функции не является частью ее сигнатуры, поэтому определять две функции, отличающиеся только типом возвращаемого значения, нельзя.

После добавления приведенного выше кода у функции MaxValue() появятся две версии, одна из которых будет принимать в качестве входных данных массив значе­ний типа int и возвращать максимальное значение в нем как число типа int, а вто­рая – принимать в качестве входных данных массив значений типа double и возвра­щать максимальное значения в нем в виде числа типа double.

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

При перегрузке функций учитываются все аспекты их сигнатур. Например, может существовать две разных версии функции, принимающие параметры, соответствен­но, по значению и по ссылке:

static void ShowDouble (ref int val){}

static void ShowDouble (int val){}

Решение по поводу того, какая версия должна использоваться, будет принимать­ся на основании того, содержится в вызове функции ключевое слово ref или нет. Например, следующая строка кода приведет к вызову той версии, которая принимает параметры по ссылке:

ShowDouble(ref val);

Показанная ниже строка кода обеспечит вызов версии, которая принимает пара­метры по значению:

ShowDouble(val);