Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
C#, 320 стр..doc
Скачиваний:
8
Добавлен:
16.11.2018
Размер:
3.64 Mб
Скачать

Деструкторы класса

Если задача создания объектов полностью возлагается на программиста, то задача удаления объектов, после того, как они стали не нужными, в Visual Studio .Net снята с программиста и возложена на соответствующий инструментарий - сборщик мусора. В классическом варианте языка C++ деструктор так же необходим классу, как и конструктор. В языке C# y класса может быть деструктор, но он не занимается удалением объектов и не вызывается нормальным образом в ходе выполнения программы. Так же, как и статический конструктор, деструктор класса, если он есть, вызывается автоматически в процессе сборки мусора. Его роль - в освобождении ресурсов, например, файлов, открытых объектом. Деструктор C# фактически является финализатором (finalizer), с которыми мы еще встретимся при обсуждении исключительных ситуаций. Приведу формальное описание деструктора класса Person:

~Person()

{

//Код деструктора

}

Имя деструктора строится из имени класса с предшествующим ему символом ~ (тильда). Как и у статического конструктора, у деструктора не указывается модификатор доступа.

Проектирование класса Rational

В заключение этой лекции займемся проектированием класса Rational, описывающего известный в математике тип данных - рациональные числа. По ходу проектирования будут вводиться новые детали, связанные с описанием класса. Начнем проектирование, как обычно, с задания тега <summary>, описывающего назначение класса, его свойства и поведение. Вот этот текст:

/// <summary>

/// Класс Rational

/// определяет новый тип данных - рациональные числа и

/// основные операции над ними - сложение, умножение,

/// вычитание и деление. Рациональное число задается парой

/// целых чисел (m,n) и изображается обычно в виде дроби m/n.

/// Число m называется числителем,n - знаменателем. Для

/// каждого рационального числа существует множество его

/// представлений, например, 1/2, 2/4, 3/6, 6/12 - задают

/// одно и тоже рациональное число. Среди всех представлений

/// можно выделить то, в котором числитель и знаменатель

/// взаимно несократимы. Такой представитель будет храниться

/// в полях класса. Операции над рациональными числами

/// определяются естественным для математики образом

/// </summary>

public class Rational

{

// Описание тела класса Rational

}//Rational

Свойства класса Rational

Два целых числа - m и n представляют рациональное число. Они и становятся полями класса. Совершенно естественно сделать эти поля закрытыми. Разумная стратегия доступа к ним - "ни чтения, ни записи", поскольку пользователь не должен знать, как представлено рациональное число в классе, и не должен иметь доступа к составляющим рационального числа. Поэтому для таких закрытых полей не будут определяться методы-свойства. Вот объявление полей класса:

//Поля класса. Числитель и знаменатель рационального числа.

int m,n;

Конструкторы класса Rational

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

/// <summary>

/// Конструктор класса. Создает рациональное число

/// m/n, эквивалентное a/b, но со взаимно несократимыми

/// числителем и знаменателем. Если b=0, то результатом

/// является рациональное число 0 -пара (0,1).

/// </summary>

/// <param name="a">числитель</param>

/// <param name="b">знаменатель</param>

public Rational(int a, int b)

{

if(b==0) {m=0; n=1;}

else

{

//приведение знака

if( b<0) {b=-b; a=-a;}

//приведение к несократимой дроби

int d = nod(a,b);

m=a/d; n=b/d;

}

}

Как видите, конструктор класса может быть довольно сложным.

В нем, как в нашем случае, может проверяться корректность задаваемых аргументов. Для рациональных чисел мы полагаем, что задание нулевого знаменателя означает задание рационального числа 0, и этоэквивалентно заданию пары (0, 1). В остальных случаях выполняется приведение заданной пары чисел к эквивалентному рациональному числу с несократимыми числителем и знаменателем. По ходу дела вызывается закрытый метод класса, вычисляющий значение НОД(a,b) - наибольшего общего делителя чисел a и b.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]