
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