Скачиваний:
61
Добавлен:
24.03.2015
Размер:
267.78 Кб
Скачать

11.4. Пример класса и его объектов

Приведем пример объявления класса и особенностей работы с его объектами, рассмотрев, следующую задачу.

В научной записи (в научной нотации) число представляется в виде произведения двух чисел: целой степени р числа 10 и числа m, удовлетворяющего условию 1.0 <= m < 10.0. Иногда р называют показателем, am- мантиссой числа. Таким образом, запись каждого числа выглядит так: m*10р. (При выводе значения числа в научной нотации возведение в степень будем обозначать символом “^”)

Примеры: постоянная Авогадро: 6.02486 * 1023 (г/моль)-1, заряд электрона: -4.80286 * 10-10 СГСЭ.

Определить класс Real для представления чисел в научной нотации. В классе определить метод для вывода на консоль значения объекта и метод для увеличения на 1 значения мантиссы числа. При этом значение числа увеличивается, конечно, не на 1, а на 10p.

Один из возможных вариантов определения такого класса (программа 11_04.cs):

class Real // Класс чисел в научной нотации

{ // Закрытые поля:

double m = 8.0; // мантисса - явная инициализация

int p; // порядок - инициализация по умолчанию

// Метод - приращение мантиссы:

public void incrementM()

{

m += 1;

if (m >= 10)

{

m /= 10;

p++;

}

}

// Метод для вывода значения числа (объекта):

public void display()

{

Console.WriteLine("Real object = {0,8:F5}*10^{1,-3:D2}", m, p);

}

}

В объявлении полей мантиссы double m = 8.0; и порядка int p; модификаторы не использованы, и по умолчанию переменные mир закрыты для доступа извне (имеют статус доступа private). При создании каждого объекта класса поля объекта инициализируются. Если инициализатор переменной поля отсутствует, то выполняется ее инициализация умолчиваемым значением. В нашем примере переменная m получает явно заданное начальное значение 8.0, а переменная р при создании объекта инициализируется целочисленным значением 0.

В классе явно определены два нестатических открытых (имеющих статус доступа public) метода. Метод с заголовком

public void incrementM()

при каждом обращении к нему увеличивает на величину 10р значение числа, представляемого объектом класса Real. У метода пустой список параметров и метод ничего не возвращает в точку вызова. Обратите внимание, что в теле метода изменяются закрытые члены класса (поля m и р). То есть метод непосредственно обращается к переменным закрытых полей, и это не требует уточнений их имен.

Метод с заголовком

public void display()

осуществляет вывод изображения числового значения, представляемого объектом класса Real. Метод открытый, ничего не возвращает в точку вызова и имеет пустой список параметров. В теле метода выполняются обращения к закрытым полям mир, значения которых выводятся на консоль в виде m*10^р.

Чтобы привести пример создания и использования объектов класса Real, напомним следующее. Класс является типом ссылок, то есть переменная с типом пользовательского класса представляет собой всего-навсего ссылку на объект класса. При создании переменной класса, ей соответствующий объект может еще не существовать или эта переменная еще не связана ни с каким объектом. Для создания объекта класса используется выражение с операцией new, где в качестве операнда -обращание к конструктору объектов класса.

Возникает вопрос, а как же быть, если в нашем классе Real нет явного определения конструктора? В языке С# принято, что при отсутствии конструктора в декларации класса, в этот класс компилятор автоматически встраивает открытый конструктор умолчания, то есть конструктор, при обращении к которому не требуется задавать аргументы. В следующейпрограмме определяются ссылка number типа Real и создаётся связанный с нею объект. К объекту применяются нестатические методы класса Real.

{

Real number = new Real(); // ссылка и объект

number.display();

Console.WriteLine("number.ToString(): " + number.ToString());

Console.WriteLine("number.GetType(): " + number.GetType());

for (int i = 0; i < 4; i++)

{

number.incrementM();

number.display();

}

}

Для краткости здесь только текст функции Main(). Предполагается, что и определение класса Real и функция Main() принадлежат одному пространству имён. Результаты выполнения программы:

Real object = 8,00000*10^00

number.ToString(): Real

number.GetType(): Real

real object = 9,00000*10^00

real object = 1,00000*10^01

real object = 2,00000*10^01

real object = 3,00000*10^01

В теле функции Main() оператор Real number = new Real(); объявляет переменную number - ссылку типа Real. Выражение с операцией new представляет собой обращение к конструктору умолчания, неявно включенному компилятором в класс Real. Тем самым создан объект класса Real и с ним связана ссылка number. Оператор

number.display();

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

Real object = 8,00000*10^00

Вид представления определяет форматная строка метода Console.WriteLine(), вызываемого в теле метода display(). Так как при создании объекта использован конструктор умолчания Real(), то переменные (поля) объекта получили значения за счет их инициализации (m=8.0 и р=0).

Следующие два оператора метода Main() иллюстрируют применимость к объектам введенного программистом-пользователем класса Real, методов, унаследованных этим классом от класса object. Как мы уже говорили,, класс object является первичным базовым классом всех классов программ на С#. Применяемые к объектам пользовательского класса Real методы ToString() и GetType() позволяют получить имя этого класса.

В цикле с заголовком for (int i = 0; i < 4; i++) выполняются обращения к методам number.incrementM() и number.display(). Первый из них изменяетзначения полей объекта, связанного со ссылкой number, второй - как мы уже рассмотрели, выводит их значения на консольный экран. Приведенные результаты иллюстрируют изменения объекта.

Прежде чем завершить пояснения особенностей определенного нами класса и возможностей работы с его объектами, отметим, что в функции Main() используются только открытые методы класса Real. В объявлениях методов incrementM() и display() явно использован модификатор public. Конструктор умолчания Real() создается компилятором автоматически как открытый. Именно названные три метода класса Real формируют его внешний интерфейс. Обращания к закрытым полям класса невозможны. Если попытаться использовать вне класса, например, такой оператор:

Console.Write("m = {0}", number.m); то компилятор сообщит об ошибке:

Error 'Real.m' is inaccessible due to its protection level

Соседние файлы в папке Lekc_C#