Г. Шилдт - С# 3.0 Полное руководство. 2010 (1160798), страница 31
Текст из файла (страница 31)
Для того чтобы добавить метод в класс Ви11П1пгь достаточно указать его в области объявлений в данном классе. В качестве примера ниже приведен переработанный вариант класса Ви11бапьв СОДЕРжащий метод Атеарегрегзоп (), который выводит площадь, рассчитанную на одного человека в конкретном здании. // добавить метод в класс Виг1бапч. из1пд зузтеки с1азз Ви11бьпч ( ривьгс 1пт Г1оогз( // количество этажей рип11с Епт Агеа; // общая плошадь здания риЬ11с Епт Оссираптзт // количество жильцов // Вывести площадь на одного человека. риЬ11с чо16 Атеарегрегзоп() ( Сопво1е.нг1теЬЕпе(" " т Агеа / Оссираптв + " приходится на одного человека") // Использовать метод АгеаРегРегзоп() с1авв Ви11б1пдпешо ( втат1с чо1б Иа1п() ( Ви11б1пч Ьоиве = пек Ви11бьпд(); Ви11б1пп оЕЕ1се = пен Виг1бгпд()т // Присвоить значения полям в объекте почве.
Ьоиве.оссираптв = 4( Ьоиве.дтеа = 2500( почве.Г1оогз = 2; // Присвоить значения полям в объекте оЕЕгсе. оЕЕ1се.оссираптв 25( оЕЕ1се.лтеа = 4200( оЕЕЕсе.Г1оогз = 3( Сопво1е.нтьтеъьпе("дом имеет:1п почве.Г1оогз + " этажаМ Ьоиве.оссираптз + " жильцаМ " + Ьоизе.Атеа + " кв. футов общей площади, иэ них")) Ьоиве.агеаРегРетвоп()т Сопзо1е.итгтедвпе(]т Сопво1е.Иг1теььпе("Учреждение имеет:1п оЕЕЕсе.Г1оога + " этажа1п оЕЕгсе.оссираптз + " работников1п " + оЕЕгсе.Агеа + Глава 6.
Введение е классы, объекты и методы 153 " кв. футов обшей плошади, иэ них")т оШсе.йгеарегрегвоп()т ) Эта программа дает такой же результат, как и прежде: дом имеет: 2 этажа 4 жильца 2500 кв. футов общей площади, иэ них 625 приходится на одного человека Учреждение имеет: 3 этажа 25 работников 4200 кв. футов общей площади, иэ них 168 приходится на одного человека Рассмотрим основные элементы этой программы, начиная с метода Агеаре грега оп () . Первая его строка выглядит следующим образом: рцъттс чоьб агеарегрегаоп() ( В этой строке объявляется метод, именуемый Агеарегрегзоп и не имеющий параметров. Для него указывается тип рц)э11с, а это означает, что его можно вызывать из любой другой части программы. Метод Агеарегрегэоп () возвращает пустое значение типа чохб, т.е.
он практически ничего не возвращает вызывающей части программы. Анализируемая строка завершается фигурной скобкой, открывающей тело данного метода. Тело метода Агеарегрегэоп () состоит всего лишь из одного оператора. Сопэо1е.иг1геь1пе(" " + Агеа / Оссцрапгэ + " приходится на одного человека") Этот оператор осуществляет вывод величины площади на одного человека, которая получается путем деления общей плошади здания (переменной Агеа) на количество жильцов (переменную ()ссцрапгэ). А поскольку у каждого объекта типа Вц114(1пс имеется своя копия переменных Агеа и Оссцрапгэ, то при вызове метода Агеарегрегзоп () в вычислении используются копии этих переменных, принадлежащие вызывающему объекту. Метод йгеарегрегзоп () завершается закрывающейся фигурной скобкой.
Когда встречается эта скобка, управление программой передастся обратно вызывающему объекту. Далее проанализируем внимательно следующую строку кода из метода мати (): Ьоцэе .АгеаРегРегвоп () т В этой строке вызывается метод йгеарегрегэоп () для объекта )конзе. Это означает, что метод Агеарегрегэоп () вызывается относительно объекта, на который ссылается переменная )топ ее, и для этой цели служит оператор-точка. Когда метод Агеарегре ге оп ( ) вызывается, ему передается управление программой. А по его завершении управление передается обратно вызывающей части программы, выполнение которой возобновляется со строки кода, следующей после вызова данного метода.
В данном случае в результате вызова )зоцэе. Агеарегрегзоп () выводится площадь на одного человека в здании, определенном в объекте йоп ее. Аналогично, в результате вызова отт1се. йгеарегрегзоп () выводится площадь на одного человека в здании, определенном в объекте от г1се. Таким образом, при кюкдом вызове метода Агеарегреге оп () выводится площадь на одного человека для указанного объекта. 154 Часть ). язык Сз В методе Агеарегрегзоп () особое внимание обращает иа себя следующее: обращение к переменным экземпляра Агеа и Оссирапгз осуществляется непосредственно, т.е. без помощи оператора-точки.
Если в методе используется переменная экземпляра, определенная в его классе, то делается это непосредственно, без указания явной ссылки на объект и без помощи оператора-точки. Понять это нетрудно, если хорошенько подумать. Ведь метод всегда вызывается относительно некоторого объекта его класса. Как только вызов произойдет, объект становится известным. Поэтому объект ие нужно указывать в методе еще раз. В данном случае это означает, что переменные экземпляра Агеа и Оссирапгз в методе Агеарегрегзоп () неявно ссылаются иа копии этих же перемениых в том объекте, который вызывает метод Агеарегрегэоп () . Не заметку! Лопутно следует заметить, что значение переменной Оссирапгз в методе Агеарегрегзоп () не должно быть равно нулю бэта касается всех примеров, приведенных в данной главе).
Если бы значение переменной О с с иран се оказалось равным нулю, то произошла бы ошибка из-за деления на нуль. В главе 13, где рассл|атриваются исключительные ситуации, будет показано, каким образом в Св отслеживаются и обрабатьшаются ошибки, которые могут возникнуть во время выполнения программы. Возврат из метода В целом возврат из метода может произойти при двух условиях. Во-первых, когда встречается фигурная скобка, закрывающая тело метода, как показывает пример метода Агеарегрегвоп () из приведенной выше программы. И во-вторых, когда выполняется оператор ге гиги.
Имеются две формы оператора ге сиги: одна — для методов типа той|1, т.е. тсх методов, которые ие возвращают значения, а другая — для методов, возвращающих конкретные значения. Первая форма рассматривается в этом разделе, а в следующем разделе будет поясиено, каким образом значения возвращаются из методов. Немедленное завершение метода типа чо1с( можно вызвать, используя следующую форму оператора гегигп: гвсигп| Когда выполняется этот оператор, управление возвращается вызывающей части программы, а оставшийся в методе код пропускается.
В качестве примера рассмотрим следующий метод: рис)1с но1С Муиесь Н ( ьпг 1| Гог(1=0; 1<10| 1++) ( |Г(1 == 5) гесигп; гУ прервать на шаге 5 Спп*о1е.пг1сеъъпе()| ) ) В, шипом примере выполняется лишь 5 полноценных шагов цикла г ог, поскольку при значении 5 переменной 1 происходит возврат из метода. В погоде допускается наличие нескольких операторов гегигп, особенно если имеются два или более вариантов выхода из него. Например; риЫ1с чо1С МуМеги() ( 11(иопе) гегигп| Глава 6.
Введение в классы, объекты и методы 155 О ... РГ(еггог) гесцгпт ) В данном примере возврат из метода происходит в двух случаях: если метод завершает свою работу или происходит ошибка. Но пользоваться таким приемом программирования следует очень аккуратно.
Ведь из-за слишком большого числа точек выхода из метода может нарушиться структура кода. Итак, напомним еше раз: возврат из метода типа чо1т) может произойти при двух условиях: по достижении закрывакпцей фигурной скобки или при выполнении оператора гесцгп. Возврат значения Методы с возвратом типа чо1г) нередко применяются в программировании, тем не менее, большинство методов возвращают конкретное значение. В действительности способность возвращать значение является одним из самых полезных свойств метода.
Возврат значения уже демонстрировался в главе 3 на примере метода ма си. Вк) гс (), использовавшегося для получения квадратного корня. Возвращаемые значения используются в программировании с самыми разными целями. В одних случаях, как в примере метода Магп.
Вг(гг (), возвращаемое значение содержит результат некоторого вычисления, в других — оно может просто указывать на успешное или неудачное завершение метода, а в третьих — содержать код состояния. Но независимо от преследуемой цели использование возвращаемых значений является неотьемлемой частью программирования на С№. Для возврата значения из метода в вызываюшую часть программы служит следующая форма оператора гег цгш геспгп значение; где значение — это конкретное возвращаемое значение. Используя возвращаемое значение, можно усовершенствовать рассматривавшийся ранее метод Агеарегрегяоп () . Вместо того чтобы выводить величину площади на одного человека, лучше возвратить ее из этого метода.
Среди прочих преимушеств такого подхода следует особо отметить возможность использовать возвращаемое значение для выполнения других вычислений. Приведенный ниже пример представляет собой улучшенный вариант рассматривавшейся ранее программы с усовершенствованным методом АгеаРегрегяоп (), возвращающим величину площади на одного человека вместо того, чтобы выводить ее. // Возвратить значение из метода Агеарегрегяоп() цяьпо Яуясещт с1аяя Вц11пьпо ( рцЬ11с Рпс Р1оогят // количество этажей рцьььс 1пс Асеан // общая площадь здания рцЬ11с гпс Оссцрапсят // количество жильцов // Возвратить величину площади на одного человека.
рцЬ11с гпг Агеарегрегяоп() гесцгп Агеа / Оссцрапсяп ) 166 Часть ). Язык С№ // Испольэовать значение, возвращаемое // методом АгеаРегРегяоп(). с1аяя Ви1161пдоещо ( згаг1с уогб Иатп() ( Ви11бапд Поияе = пеи Ви11сапд () т Ви11бзпд оттьсе = пеи Ви1161пд()т зпг агеаРР( // площадь на одного человека // Присвоить значения полям в объекте Поизе. Пензе.оссирапся = 44 Ьоияе.агеа = 25004 Ьоияе.Р1оогя 24 // Присвоить значения полям в объекте оШсе. отгзсе.оссирапгз = 254 отт№се.Агеа = 4200( оттасе.г1оогя Зт // Получить площадь на одного человека в жилом доме. агеаРР = Ьоияе.агеарегрегяоп()т Сопяо1е.игасег зле("дом имеет: 1п Ьоияе.Р1оогя ь " этажа1п Почве.оссирапгз + " жильца1п поияе.Агеа ь " кв. футов общей плошади, иэ них1п агеаРР + " приходится на одного человека"); Сопзо1е.Игасеьапе() т // Получить площадь на одного человека в учреждении.
агеаРР = оШсе.АгеаРегРегзоп()т Сопяо1е.игтгеьапе("Учреждение имеетктп отт1се.Р1оогз + " этажа1п " + оттзсе.оссирапгя + " работникоя1п оттзсе.Агеа ь " кв. футов общей плошади, из нихМ агеаРР + " приходится на одного человека"); Эта программа даст такой же результат, как и прежде.
В данной программе обратите внимание на следутощее: когда метод Агеарегрегзоп () вызывается, он указывается в правой части оператора присваивания. А в левой части этого оператора указывается переменная, которой передается значение, возвращаемое методом Агеарегрегзоп (). Следовательно, после выполнения оператора агеаРР Ьоияе.агеаРегРегзоп()т в переменной агеаРР сохраняется величина площади на одного челОвЕка в жилОм ДОМЕ 1объект )тоизе). Глава б.