Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CSBasicCourse2ndedPodbelsky / CSBasicCourse2ndedPodbelsky.rtf
Скачиваний:
27
Добавлен:
22.03.2016
Размер:
11.9 Mб
Скачать

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

Приведем пример объявления класса и особенностей работы с его объектами,

рассмотрев, следующую задачу.

В технике широко распространеы разнообразные цифровые счетчики,

построенные по «кольцевой» схеме. В каждом из них задано предельное значение,

по достижению которого счетчик «сбрасывается» в начальное состояние. Так

обычно устроены счетчики километража (пробега) в автомобилях, счетчик

и

потребления воды, электроэнергии и т.п. Определить класс Counter, объект

которого моделирует работу кольцевого счетчика. В классе декларировать

статическое поле maxCount для представления предельного значения, допустимого

для показаний счетчиков – объектов класса. Текущее показание конкретного

счетчика будет представлять целочисленное поле объекта (нестатическое поле

класса) с именем count. В классе определить: метод increment() для увеличения на 1

текущего показания счетчика, метод getCount() для считывания текущего показания

и метод display() для вывода информации о состоянии и возможностях счетчика.

Один из возможных вариантов определения такого класса (программа

11_04.cs):

// 11_04.cs - класс "кольцевой счетчик"

using System;

class Counter // Класс "кольцевой счетчик"

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

static int maxCount = 100000; // продельное значение

Int count; // текущее показание

// Метод - приращение показания:

public void increment() {

count += 1;

if (count >= maxCount) count = 0;

}

// Метод для получения текущего показания:

public int getCount() { return count; }

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

public void display() {

Console.WriteLine("Reading: {0,-8} maxCount: {1,-8}",

count, maxCount);

}

}

В объявлении полей static int maxCount и int count; модификаторы доступа не

использованы, и по умолчанию переменные maxCount и count закрыты для доступа

извне

(имеют

статус

доступа

private).

Статическое

поле

maxCount

инициализируется значением 100000 при компиляции. При создании каждого

объекта класса инициализируется поле count конкретного объекта. Если

инициализатор переменной поля отсутствует, то, как мы знаем, выполняется е

е

инициализация умолчиваемым значением. В нашем примере переменная count при

создании объекта инициализируется целочисленным значением 0.

В классе явно определены два нестатических открытых (имеющих статус

доступа public) метода.

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

public void increment()

при каждом обращении к нему увеличивает на 1 значение показания (поля count),

представляемого объектом класса Counter. У метода пустой список параметров и

метод ничего не возвращает в точку вызова. Обратите внимание, что в теле метода

изменяется закрытый член класса (поле count). То есть метод непосредственно

обращается к переменной закрытого поля, и это не требует уточнения его имени.

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

public void display()

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

объектом класса Counter и предельном значении maxCount, которое уже не может

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

и имеет пустой список параметров. В теле метода выполняются обращения к

закрытым полям count и maxCount, значения которых выводятся на консоль.

Чтобы привести пример создания и использования объектов класса Counter,

напомним следующее. Класс является типом ссылок, то есть переменная с типом

пользовательского класса представляет собой всего-навсего ссылку на объект

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

существовать, или эта переменная еще не связана ни с каким объектом. Для

создания объекта класса используется выражение с операцией new, где в качестве

операнда – обращание к конструктору объектов класса.

Возникает вопрос, а как же быть, если в нашем классе Counter нет явного

определения конструктора? В языке C# принято, что при отсутствии конструктора в

декларации класса, в этот класс компилятор автоматически встраивает открытый

конструктор умолчания

"конструктор умолчания" , то есть конструктор, при

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

е

определяются ссылки с1 и с2 типа Counter и создаются связанные с ними объекты.

К объектам посредством ссылок применяются нестатические методы класса

Counter.

static void Main( ) {

Counter c1 = new Counter( ); // конструктор умолчания

Counter c2 = new Counter( );

c1.display( );

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

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

for(int i = 0; i < 150000; i++) {

c1.increment( );

if (i % 10 == 0) c2.increment( );

}

Console.WriteLine("c1.getCount() = " + c1.getCount( ));

c2.display( );

}

Для краткости здесь только текст функции Main( ). Предполагается, что и

определение класса Counter и функция Main() принадлежат одному пространству

имён.

Результаты выполнения программы:

Reading: 0 maxCount: 100000

c1.ToString( ): Counter

c1.GetType( ): Counter

c1.getCount( ) = 50000

Reading: 15000 maxCount: 100000

В теле функции Main( ) оператор Counter c1 = new Counter(); объявляет

переменную с1 – ссылку типа Counter. Выражение с операцией new представляет

собой обращение к конструктору умолчания, неявно включенному компилятором в

класс Counter. Тем самым создан объект класса Counter и с ним связана ссылка с1.

Аналогично определяется второй объект и связанная с ним ссылка с2.

Оператор с1.display(); – это обращение к нестатическому методу display(),

который вызывается для обработки объекта, связанного со ссылкой с1. В

результате выполнения метода на консоль выводится строка, представляющая

значения поля объекта и статического поля maxCount:

Reading: 0

maxCount: 10000

0

Вид представления определяет форматная строка метода Console.WriteLine( ),

вызываемого в теле метода display( ). Так как при создании объекта использован

конструктор умолчания Counter(), то переменные (поля) объекта получили значения

за счет их инициализации (count=0 и maxCount=100000).

Следующие два оператора метода Main( ) иллюстрируют применимость к

объектам введенного программистом-пользователем класса Counter, методов,

унаследованных этим классом от класса object. Как мы уже говорили, класс object

является первичным базовым классом всех классов программ на C#. Применяемые к

объектам пользовательского класса Counter методы ToString( ) и GetType( )

позволяют получить имя этого класса.

В цикле с заголовком for (int i = 0; i < 150000; i++) выполняются обращения к

методу incrementM() для двух объектов класса, адресуемых ссылками с1 и с2. Для

первого из них выполняется 150000 обращений, для второго – в 10 раз меньше.

Метод при каждом обращении увеличивает текущее значение счетчика на 1, но

«следит» за переполнением. Поле 99999 обращений счетчик, связанный со ссылкой

с1 будет обнулен. Приведенные результаты иллюстрируют изменения объектов.

Прежде чем завершить пояснения особенностей определенного нами класса и

возможностей работы с его объектами, отметим, что в функции Main()

используются только открытые методы класса Counter. В объявлениях методов

increment(), getCount() и display() явно использован модификатор public.

Конструктор умолчания Counter() создается компилятором автоматически как

открытый. Именно названные четыре метода класса Counter формируют его

внешний интерфейс. Обращения к закрытым полям класса невозможны. Если

попытаться использовать вне класса, например, такой оператор:

Console.Write ("count = {0 }", c1.count);

то компилятор сообщит об ошибке:

Error

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