ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 11.12.2025

Просмотров: 3169

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

С# гарантирует, что объект начинает существование в определенном состоянии: полненным нулями. Однако для многих классов (пожалуй, для подавляющего большен ства) такое нулевое состояние не является корректным. Рассмотрим класс BankА count, о котором уже шла речь ранее в этой главе,

public class BankAccount

{

int nAccountNumber ; double dBalance ;

I I . . . д р у г и е члены

}

Хотя нулевое начальное значение баланса вполне корректно, нулевое значение ном ра счета определенно корректным не является.

Поэтому класс BankAccount включает метод InitBankAccount ( ) , инициализи рующий объект. Однако такой подход перекладывает слишком большую ответстве ность на прикладную программу, использующую данный класс. Если вдруг приложен забудет вызвать метод InitBankAccount ( ) , то прочие методы банковского счета гут оказаться неработоспособны, хотя при этом и не будут содержать никаких ошибок Класс не должен полагаться на внешние функции наподобие метода InitBankA count ( ) , которые должны обеспечивать корректное состояние его объектов.

Для решения данной проблемы класс предоставляет специальную функцию, автома тически вызываемую С# при создании объекта — конструктор класса. С# требует, что бы конструктор носил то же имя, что и имя самого класса, так что конструктор класса BankAccount имеет следующий вид:

public

voi d Main(string[] args)

{

 

 

BankAccount

ba = ne w B a n k A c c o u n t ( ) ;

}

 

 

public

class

BankAccount

{

 

 

//Номера банковских счетов начинаются с 1000 и

//назначаются последовательно в возрастающем порядке static int nNextAccountNumbe r = 1000 ;

//Для каждого счета поддерживаются его номер и баланс int nAccountNumber ;

double dBalance ;

//Конструктор BankAccount - обратите внимание на его имя

public BankAccount() // Требуются круглые скобки, могут

//иметься аргументы, возвращаемый

//тип отсутствует

{

nAccountNumbe r = ++nNextAccountNumber ; dBalance = 0.0;

}

I I . . . прочие члены . . .

}

246

Часть

IV.

Объектно-ориентированное

программирована


Содержимое конструктора BankAccount то же, что и у первоначального метода InitBankAccount (). Однако конструктор имеет некоторые особенности:

он всегда имеет то же имя, что и сам класс;

он не имеет возвращаемого типа, даже типа void;

функция M a i n () не должна вызывать никаких дополнительных функций для инициализации объекта при его создании.

Создание объектов

Теперь посмотрим на конструкторы в деле. Для этого рассмотрим програм­ му DemonstrateDefaultConstruetor .

// DemonstrateDef a u l t C o n s t r u c t o r - демонстрация

работы

// конструкторов по

умолчанию;

создает класс с

конструктором

// и рассматриваем

несколько сценариев

 

using System;

 

 

 

namespace DemonstrateDef a u l t C o n s t r u c t o r

 

I

 

 

 

// MyObject - создание класса

с "многословным"

// конструктором и внутренним объектом public class MyObject

I

// Этот член - данные является свойством класса

static MyOtherObject staticObj = n e w M y O t h e r O b j e c t ( ) ;

// Этот член - данные является свойством объекта MyOtherObject d y n a m i c O b j ;

// Конструктор (с обильным выводом на экран) public M y O b j e c t O

{

Console.WriteLine("Начало конструктора M y O b j e c t " ) ;

Console.WriteLine("(Статические члены - данные

"

+

 

"конструируются до вызова этого " +

 

"конструктора)11) ;

 

 

Console.WriteLine("Теперь динамически создаем

"

+

 

"нестатический ч л е н - д а н н ы е : ") ;

dynamicObj =

n e w M y O t h e r O b j e c t О ;

 

 

Console.WriteLine("Завершение конструктора M y O b j e c t " ) ;

// MyOtherObject

- у этого класса тоже многословный

 

// конструктор,

но внутренние члены - данные отсутствуют

public class MyOtherObj ect

 

 

public MyOtherObject ()

 

 

{

.

 

 

Console.WriteLine("Конструирование M y O t h e r O b j e c t " ) ;

Глава 11, Классы

247


p u b l ic class Program

{

public static void Main(string[] args)

{

Console . WriteLine("Начал о функции M a i n ( ) " ) ; Console . WriteLine("Создание локального объекта " +

 

 

 

"MyObject

в M a i n ( ) : " ) ;

 

 

MyObject

localObject = ne w

M y O b j e c t O ;

 

 

// Ожидаем подтверждения пользователя

 

 

Console . WriteLine("Нажмите

<Enter> для " +

 

 

 

"завершения п р о г р а м м ы . . . " ) ;

 

 

C o n s o l e . R e a d ( ) ;

 

 

}

 

 

 

1

}

 

 

 

 

}

 

 

 

 

Выполнение данной программы приводит к следующему выводу на экран:

 

Начало

функции

Main()

 

 

Создание локального объекта MyObject в M a i n O :

 

Конструирование

MyOtherObjec t

 

 

Начало

конструктора MyObject

 

 

(Статические члены - данные конструируются до вызова

 

этого

конструктора)

 

 

Теперь динамически создаем нестатический член - данные :

 

Конструирование

MyOtherObject

 

 

Завершение конструктора MyObject

 

 

Нажмите <Enter>

для завершения программы ...

Вот реконструкция происходящего при запуске программы.

1.Программа начинает работу, и функция Mai n () выводит начальное сообщение сообщение о предстоящем создании локального объекта MyObject.

2.Функция M a i n () создает объект localObject типа MyObject.

3.MyObject содержит статический член staticObj класса MyOtherObject. В

статические члены-данные создаются до первого запуска конструктора MyObject В этом случае С# присваивает переменной staticObj ссылку на вновь создан» объект перед тем, как передать управление конструктору MyObject.

4.Конструктор MyObject получает управление. Он выводит начальное сообща и напоминает, что статический член уже сконструирован до того, как начал pal ту конструктор MyO b j ect О .

5.После объявления о своих намерениях по динамическому созданию нестатн ского члена конструктор MyObject создает объект класса MyOtherObject использованием оператора new, что сопровождается выводом второго сообща о создании MyOtherObjec t на экран.

6.Управление возвращается конструктору MyObject, который, в свою очередь возвращает управление функции Mai n ().

7.Программа выполнена.

248

Часть

IV.

Объектно-ориентированное

программировав



Выполнение конструктора в отладчике

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

1. Соберите программу с помощью команды меню Build о Build Demonstrate-

DefaultConstructor.

2.Перед тем как приступить к выполнению программы в отладчике, устано­ вите точку останова на вызове Console.WriteLineО в конструкторе

MyOtherObject.

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

Puc. 11.1. Красная пиктограмма на серой полосе свидетельствует о на­ личии точки останова

3. Воспользуйтесь командой меню D e b u g ^ S t e p Into (или нажмите клавишу

<F11>).

Ваши меню, полосы инструментов и окна должны немного измениться, а откры­ вающая фигурная скобка функции M a i n () — оказаться выделенной желтым цве­ том фона.

4. Нажмите клавишу <F11> еще три раза и установите курсор мыши над пе­ ременной localObject (без щелчка).

Вы находитесь перед вызовом конструктора MyObject . Ваш экран должен вы­ глядеть примерно так, как на рис. 11.2. На рисунке видно, что в настоящий мо-

toa 77. Классы

249