Г. Шилдт - С#4.0 Полное руководство (1160795), страница 29
Текст из файла (страница 29)
Кроме того, в качестве имен методов нельзя использовать ключевые слова СК В этой книге методы именуются в соответствии с условными обозначениями, принятыми в литературе по СК В частности, после имени метода следуют круглые скобки. Так, если методу присвоено имя бес(га1, то в тексте книги он упоминается в следующем виде: бесча1 () . Такая форма записи помогает отличать имена методов от имен переменных при чтении книги. Ниже приведена общая форма определения метода: доступ яоярад)аеммй тип имя(список параметроя) ( тело метода ) где доступ — это модификатор доступа, определяющий те части программы, из которых может вызываться метод. Как пояснялось выше, указывать модификатор досгупа необязательно.
Но если он отсутствует, то метод оказывается закрытым (ргдуасе) в пределах того класса, в котором он обьявляется. Мы будем пока что объявлять методы открытыми (рно11с), чтобы вызывать их из любой другой части кода в программе. Затем яоэрад(аемый тип обозначает тип данных, возвращаемых методом.
Этот тип должен быть действительным, в том числе и типом создаваемого класса. Если метод не возвращает значение, то в качестве возвращаемого для него следует указать тип то1с(. Далее имя обозначает конкретное имя, присваиваемое методу. В качестве имени метода может служить любой допустимый идентификатор, не приводящий к (сонфликгам в текущей области обьявлений. И наконец, список параметров — это последовательность пар, состоящих из типа и идентификатора и разделенных запятыми. Параметры представляют собой переменные, получающие значение аргуменглов, передаваемых методу при его вызове. Если у метода отсутствуют параметры, то список параметров оказывается пустым. После выполнения этой последовательности операций присваивания переменная )топяе2 ссылается на тот же самый объект, что и переменная )гопяеЗ. А ссылка на объект в переменной )зопяе1 не меняется.
156 Часть 1. язык С() Добавление метода в класс Вих1015лд Как пояснялось выше, методы класса, как правило, манипулируют данными класса и предоставляют доступ к ним. С учетом этого напомним, что в приведенных выше примерах в методе Ма1п () вычислялась площадь на одного человека путем деления общей площади здания на количество жильцов. И хотя такой способ формально считается правильным, на самом деле он оказывается далеко не самым лучшим для организации подобного вычисления. Площадь на одного человека лучше всего вычислять в самом классе Вцз1с)1по, просто потому, что так легче понять сам характер вычисления. Ведь площадь на одного человека зависит от значений в полях Агеа и Оссцрапбз, инкапсулированных в классе Вц11б1по.
Следовательно, данное вычисление может быть вполне произведено в самом классе вц11с(1по. Кроме того, вводя вычисление площади на одного человека в класс Вц11бтпо, мы тем самым избавляем все программы, пользующиеся классом Вц11с(1пд, от необходимости выполнять это вычисление самостоятельно. Благодаря этому исключается ненужное дублирование кода. И наконец, добавление в класс Вц11с(1щ метода, вычисляющего площадь на одного человека, способствует улучшению его объектно-ориентированной структуры, поскольку величины, непосредственно связанные со зданием, инкапсулируются в классе Вц11с)1по. Для того чтобы добавить метод в класс ВО11с)1по, достаточно указать его в области объявлений в данном классе. В качестве примера ниже приведен переработанный вариант класса ВО11с)1пс, содержащий метод Агеа Ре грег зал (), который вьцюдит площадь, рассчитанную на одного человека в конкретном здании.
Добавить метод в класс Во11б1пэ. овьпэ Зувгещ) с1авв Вц11бгпс ( рцЬ11с ьпт Г1оогв; // количество этажей рцЬ11с ьпс Атеау // общая площадь здания рцьттс гпо Оссцрапгв; // количество жильцов // Вывести площадь на одного человека. рцьтьс чоьб АгеаРегРегвоп() ( Сопво1е.игтгеЫпе(" " + Агеа / Оссцраптв приходится на одного человека") Использовать метод АгеаРегРегвоп() с1азв Вц11бьпооещо ( воагтс гоаб Мата() ( Вць1бьпч Ьоцве = лен Вць1О1пч(); Вц11бьпс оГГ1се = пен Во11бьпЧ(); // Присвоить значения полям в объекте Ьоове.
Ьоцве.оссцрапгв = 4; Ьоцве.Агеа = 2500) Ьоцве.Г1оогв = 2; Присвоить значения полям в объекте оГГ1се. освьсе.оссцрапгв = 25; Глава 6. Введение в классы, объекты и методы 157 оттгсе.йгеа = 4200; оттгсе.г1оогя = 3; Сопзо1е.Хггяеъ1пе(ГДом имеет:1п Лоияе Р1оогя + " этяжя1п Лопяе.осспрапяя + " жильца1п Лоцяе.йгеа + кв.
футов общей площади, иэ них") Лоияе.АгеаРегРегяоп(); Сопяо1е.Хггяетдпе(); Сопяо1е.игггеьгпе("Учреждение имеет:1п ог"ггсе.г1аогя + " этажа1п от61се.бсспрапся + " работников1п оттзсе.дгеа э кв. футов общей площади, иэ них"); оттгсе.ягеяРегРегяоп О 4 Эта программа дает такой же результат, как и прежде. Дом имеет: 2 этажа 4 жильца 2500 кв. футов общей площади, из них 625 приходится на одного человека Учреждение имеет: 3 этажа 25 работников 4200 кв. футов общей площади, из них 160 приходится на одного человека Рассмотрим основные элементы этой программы, начиная с метода Агеарегрегяоп () .
Первая его строка выглядит следующим образом. рцЬ11с чоьб АгевРегРегяоп() ( В этой строке объявляется метод именуемый Аге а Ре г Ре г зоп и не имеющий параметров. Для него указывается тип рц)э1). с, а это означает, что его можно вызывать из любой другой части программы. Метод Агеарегрегяоп () возвращает пустое значение типа уофс), т.е. он практически ничего не возвращает вызывающей части программы. Анализируемая строка завершается фигурной скобкой, открывающей тело данного метода. Тело метода Агеарегрегяоп () состоит всего лишь из одного оператора.
Сопяо1е.иггсеьгпе(" " + Агеа / Оссцрапяя приходится нв одного человека" ) Этот оператор осуществляет вывод величины площади на одного человека, которая получается путем деления общей площади здания (переменной Агеа) на количество жильцов (переменную Оссцрапся). А поскольку у каждого объекта типа В011с)фпг3 имеется своя копия переменных Агеа и Оссцрапбя, то при вызове метода Агеарегрегяоп () в вычислении используются копии этих переменных, принадлежащие вызывающему объекту. 188 Часть 1. Язык С() Метод АгеаРегРегяоп () завершается закрывающейся фигурной скобкой. Когда встречается эта скобка, управление передается обратно вызывающей части программы.
Далее проанализируем внимательно следующую строку кода из метода Мадп () . Ьоияе.АгеаРегРегвоп()г В этой строке вызывается метод АгеаРегРегяоп () для объекта )тоцяе. Это означает, что метод АгеаРегРегяоп () вызывается относительно объекта, на который ссылается переменная )тоцяе, и для этой цели служит оператор-точка. Когда метод АгеаРегРегяоп () вызывается, ему передается управление программой. А по его завершении управление передается обратно вызывающей части программы, выполнение которой возобновляется со строки кода, следующей после вызова данного метода.
В данном случае в результате вызова )тоцяе. АгеаРегРегяоп () выводится площадь на одного человека в здании, определенном в объекте )зоцяе. Аналогично, в результате вызова ос()се. АгеаРегРегяоп () выводится площадь на одного человека в здании, определенном в объекте осйсе. Таким образом, при каждом вызове метода АгеаРегРегяоп () выводится площадь на одного человека для указанного объекта.
В методе АгеаРегРегвоп () особого внимания заслуживает следующее обстоятельство: обращение к переменным экземпляра Агеа и Оссцрапгя осуществляется непосредственно, т.е, без помощи оператора-точки. Если в методе используется переменная экземпляра, определенная в его классе, то делается это непосредственно, без указания явной ссылки на объект и без помощи оператора-точки. Понять это нетрудно, если хорошенько подумать.
Ведь метод всегда вызывается относительно некоторого объекта его класса. Как только вызов произойдет, обьект становится известным. Поэтому объект не нужно указывать в методе еще раз. В данном случае это означает, что переменные экземпляра Агеа и Оссорапгя в методе АгеаРегРегяоп () неявно ссылаются на копии этих же переменных в том объекте, который вызывает метод АгеаРегРегяоп () . ПРИМЕЧАНИЕ Попутно следует заметить, что значение переменной Оссцрапся в методе АгеаРегРегяоп () не должно быть равно нулю (зто касается всех примеров, приведенных в данной главе).
Если бы значение переменной Оссцрапгя оказалось равным нулю, тО произошла бы ошибка из за деления на нуль. В главе 13, где рассматриваются исключительные ситуации, будет показано, каким образом в С() отслеживаются и обрабатываются ошибки, которые могут возникнуть во время выполнения программы.
Возврат из (у(етода В целом, возврат из метода может произойти при двух условиях. Во-первых, когда встречается фигурная скобка, закрывающая тело метода, как показывает пример метода АгеаРегРегвоп () из приведенной выше программы. И во-вторых, когда выполняется оператор гегцгп. Имеются две формы оператора гесцгп; одна — для методов типа чо1с1, т.е. тех методов, которые не возвращают значения, а другая — для методов, возвращающих конкретные значения.
Первая форма рассматривается в этом разделе, а в следующем разделе будет пояснено, каким образом значения возвращаются из методов. Для немедленного завершения метода типа чоус( достаточно воспользоваться следующей формой оператора тес цгп. гегигпг Глава 6. Введение в классы,объекты и методы 159 Когда выполняется этот оператор, управление возвращается вызывающей части программы, а оставшийся в методе код пропускается. В качестве примера рассмотрим следующий метод.
рпЬ11с го№0 МуМегп() гпс 1; Гаг(с=о; с<10; 1++) ( 11(1 == 5) гегпгп; №№ прервать на шаге 5 Сопво1е.иг1Сес1пе(); ) В данном примере выполняется лишь 5 полноценных шагов цикла гог, поскольку при значении 5 переменной 1 происходит возврат из метода. В методе допускается наличие нескольких операторов геспгп, особенно если имеются два или более вариантов возврата из него. Например: риЫ (и гоаб мучатся () ( /! 11(папе) геСпгп; О 11(еггог) гегпгп; В данном примере возврат из метода происходит в двух случаях: если метод завершает свою работу или происходит ошибка. Но пользоваться таким приемом программирования следует очень аккуратно. Ведь из-за слишком большого числа точек возврата из метода может нарушиться структура кода.