Г. Шилдт - С# 3.0 Полное руководство. 2010 (1160798), страница 32
Текст из файла (страница 32)
Веедение е классы, объекты н методы 167 Обратите также внимание на то, что теперь метод Агеарегрегяоп () имеет возвращаемый тип 1пг. Это означает, что он будет возвращать целое значение вызывающей части программы. Тип, возвращаемый методом, имеет очень большое значение, поскольку тип данных, возвращаемых методом, должен быть совместим с возвращаемым типом, указанным в методе. Так, если метод должен возвращать данные типа г)оиЬ1е, то в нем следует непременно указать возвращаемый тип с(оиЬ1е. Несмотря на то что приведенная выше программа верна, она, тем не менее, написана не совсем эффективно.
В частности, в ней можно вполне обойтись без переменной агеарр, указав вызов метода Агеарегрегяоп () непосредственно в операторе, содержащем вызов метода иг1ге11пе (), как показано ниже. Сопяо1з.игьгеъьпе("Дом имеетз 1п Ьоияе.г1оогя + " зтажа1п Ьоияе.оссирапся + " жильца1п Ьоияе.агеа + " кв.
футов общей площади, из них1п " + Ьоияе.лгеаРегРегяоп() " приходится на одного человека"); В данном случае при выполнении оператора, содержащего вызов метода иг1 се 1 Рпе ( ), автоматически вызывается метод пои я е. Агеаре грега оп ( ), а вОЗвРащаемое им значение передается методу игзсерфпе () . Кроме того, вызов метода Агеарегрегяоп () можно использовать всякий раз, когда требуется получить величину площади на одного человека для конкретного объекта типа Ви11с(1пс. Например, в приведенном ниже операторе сравниваются величины площади на одного человека для двух зданий. 11(Ь1.лгеарегрегяоп() > Ь2.Агеарегрегяоп()) Сопяо1е.игзгеъьпе( "В здании Ьу больше места для каждого человека"); Использование параметров При вызове метода ему можно передать одно или более значений.
Значение, передаваемое методу, называется аргументом. А переменная, получающая аргумент, называется формальным параметром, или просто параметром. Параметры объявляются в скобках после имени метода. Синтаксис объявления параметров такой же, как и у переменных. А областью действия параметров является тело цикла. За исключением особых случаев передачи аргументов методу, параметры действуют так же, как и любые другие переменные. Ниже приведен пример программы, в котором демонстрируется применение параметра В классе СЬ Книв используется метод 1ярг1ве (), который возвращает значение сгие, если ему передается значение, являющееся простым числом. В противном случае он возвращает значение га1яе.
Следовательно, возвращаемым для метода герг1ве () является тип Ьоо1. // Простой пример применения параметра. иекль Яуясевз с1аяя Спхыив ( // Возвратить значение Ггие, если значение // параметра х окажется простым числом. 158 Часть (, Язык С№ роьтьс Ьоо1 1ярг1ще(1пг х) ( г№(х <= 1/ гессгп са1яек Гог(ьпс 1=27 1 <= х/1( 1++) 11((х $1) == О) гесигп Га1яек гегнгп ггое( ) ) с1аяя Рагщпещо ( ягагьс чо1б маьп() ( СЬКыощ оЬ = пен Сьхнпщ()7 Гог(ьпс 1=2; 1 < 10( 1++) 11(оЬ.Хярг1ще(1)) Сопяо1е.иг1геььпе( 1 + " простое число."); е1яе Сопяо1е.игьгеъьпе(1 + " непростое число."); Вот какой результат дает выполнение этой программы. 1 простое число.
2 простое число. 3 простое число. 4 непростое число. 5 простое число. б непростое число. 7 простое число. 8 непростое число. 9 непростое число. В данной программе метод 1яргьще () вызывается девять раз, и каждый раз ему передается другое значение. Проанализируем этот процесс более подробно. Прежде всего обратите внимание на то, как вызывается метод 1яргьще () . Его аргумент указывается в скобках. Когда метод тяргьще () вызывается в первый раз, ему передается значение 1. Следовательно, когда метод тзргьще () начинает выполняться, его параметр х принимает значение 1. При втором вызове этого метода его параметр х принимает значение 2, при третьем вызове — значение 3 и т.д.
Таким образом, значение, передаваемое методу 1зрг1ще () в качестве аргумента при его вызове, представляет собой значение, которое принимает его параметр х. У метода может быть не только один, но и несколько параметров. Каждый его параметр объявляется, отделяясь от другого запятой. В качестве примера ниже приведен класс ськмпщ, который расширен дополнительным методом ьеазссощрассог (), возвращавшим наименьший общий множитель двух его аргументов. Иными словами, этот метод возвращает наименьшее число, на которое оба его аргумента делятся нацело.
// Добавить метод, принимающий два аргумента. ояьпч зуясещ; Глава 6, Введение е классы, объекты и методы 159 с1аяя СЬКЫив ( // Возвратить значение Сгие, если значение // параметра х окажется простым числом. рипрас Ьоо1 тярг1 е(1пг х) ( ЕЕ(х <= 1) гесигп Еа1яет Еог(1пг 1=2т 1 <= х/1т 1++) 1Е((х аа) = 0) гесигп Еа1яе) гесигп сгиет ) // Возвратить наименьший общий множитель. риЫ1с 1пг Ьеаягсоврассог(апг а, Епг Ь) ( Епс вахт ЕЕ(1яРгаве (а) (( 1яРгаве (Ь) ) гегигп 1т вах = а < Ь 7 а: Ьт Еог(апг 1=2) 1 <= вах/2/ 1ье) 1Е(((а%а) == О) аа ((Ь$1) = О)) гегигп ).т гесигп 1т ) ) с1аяя РагвРево ( ягаг1с чо10 Ма1п() ( СЬКИив оЬ пеи СЬНИив()) 1ПС а, Ьт Еог(апс 1=2т 1 < 10( 1++) ЕЕ(оЬ.1врг1ве(1)) Сопяо1е.Иг1сеВЕпе(1 + " простое число.")т е1яе Сопяо1е.ыг1сеЫпе(1 ь " непростое числя.")т а = 7( Ь 8( Сопяо1е.ыг1се11пе("Наименьший общий множитель чисел " + а + " и " + Ь + " равен " е оь.ъеаяссоврасгог(а, Ы )т а = 100) Ь = 8( Сопяо1е.ыг1сеъапе("Наименьший общий множитель чисел " + а + " и " + Ь + " равен " + оЬ.ЬеаяГСоврасгог(а, Ы )) а = 100) Ь = 75( Сопяо1е.иг1гейапе("Наименьший общий множитель чисел " + а + " и " + Ь + " равен " + оп.ъеаяССоврасгог(а, Ы )т 160 Часть!.
Язык Сз Обратите внимание на следующее: когда вызывается метод ьеаэссошрассог (), его аргументы также разделяются запятыми. Ниже приведен результат выполнения данной программы. 1 простое число. 2 простое число. 3 простое число. 4 непростое число. 5 простое число. б непростое число. 7 простое число. 8 непростое число. 9 непростое число. Наименьший общий множитель чисел 7 и 8 равен 1 Наименьший общий множитель чисел 100 и 8 равен 2 Наименьший общий множитель чисел 100 и 75 равен 5 Если в методе используется несколько параметров, то для каждого из них указывается свой тип, отличающийся от других. Например, приведенный ниже код является вполне допустимым. 1пп Иунегп(1пп а, бопЬ1е Ь, 81оап с) ( // ...
Добавление параметризированного метода в класс вя~1Жад С помощью параметризированного метода можно дополнить класс Вп1161пд новым средством, позволяющим вычислять максимальное количество жильцов в здании, исходя из определенной величины минимальной площади на одного человека. Этим новым средством является приведенный ниже метод Махосспрапп () . // Возвратить максимальное количество человек, // занимавших здание, исходя из заданной минимальной // площади на одного человека. рпь11с 1пе Махосспрапп(ьпп шьпагеа) ( геппгп Агеа / в1пкгеа: ) Когда вызывается метод махос сора пс ( ), его параметр ш1пйгеа принимает величину необходимой минимальной площади на одного человека.
На зту величину делится общая площадь здания при выполнении данного метода, после чего он возвращает результат. Ниже приведен весь класс В011б1пя, включая и метод Махосспрапг () . /* Добавить параметризированный метод, вычисляхиций максимальное количество человек, которые могут занимать здание, исходя иэ заданной минимальной площади на одного человека. */ оэьпч зузсеш; с1аээ Вп11б1пп ( рпЬ11с 1пг Г1оогз; // количество этажей Глава 6. Введение в классы, объекты и методы 161 рцб11с Епг Агеа; // общая плошадь здания рць11с Епс Осспрапгя; // количество жильцов // Возвратить площадь на одного человека. рпЬ11с Епс АгеаРегрегяоп() ( гегцгп Агеа / Осспрапгя) ) // Возвратить максимальное количество человек, // занимающих здание, исходя из заданной минимальной // площади на одного человека. рцЬ11с 1пг Махбсспрапс(апг шапдгеа) ( геспгп Агеа / шьпагеа) ) ) // Использовать метод Махбссцрапг().
с1аяя Вп1101пспешо ( ясасас чо10 Ма1п() ( Вс1101пд Ьопяе пен Вп1101пд () ) Вп1101пд оЕЕ1се = пен Вп1101пд(); // Присвоить значения полям в объекте Ьопяе. Ьопяе.бссцрапся = 4; Ьопяе.Агеа 2500; Ьопяе.Р1оогя 2; // Присвоить значения полям в объекте оЕЕ1се. оЕЕ1се.бссцрапгя = 25; оЕЕ1се.агеа = 4200) оЕЕ1се.у1оогя = 3) Сопяо1е.нг1ге11пе( "Максимальное количество человек в доме, 1п" ь "если на каждого должно приходиться " ь 300 + " кв. футов: Ьопяе.махбсспрапк(300)]: Сопяо1е.нг1геЬЕпе( "Максимальное количество человек " + "в учреждении, 1п" + "если на каждого должно приходиться " + 300 + " кв.
футов: " + оЕЕЕсе.иахбсспрапс(300))) Выполнение этой программы дает следу(О)пий результат: Максимальное количество человек в доме, если на каждого должно приходиться 300 кв. футов: 8 Максимальное количество человек в учреждении, если на каждого должно приходиться 300 кв. футов: 14 162 Часть!. язык Сз Исключение недоступного кода При создании методов следует исключить ситуацию, при которой часть кода не может быть выполнена ни при каких обстоятельствах.
Такой код называется недоступным и считается в С(( неправильным. Если создать метод, содержащий недоступный код, компилятор выдаст предупреждающее сообщение соответствующего содержания. Рассмотрим следующий пример кода: роьььс чоьо МуиеСЬ() ( сьаг а, Ь) 15 (а==И ( Сопво1е.игьгеъьпе("равноЯ); гесогп; ) е1яе ( Сопяо1е.игьсеъьпе(Яне равно"): гегогп; ) Сопяо1е.иг1геъьпе("вто недоступный код"); В данном примере возврат из метода мумесь () всегда происходит до выполнения последнего оператора, содержащего вызов метода игьееЬапе () .
Если попытаться скомпилировать этот код, то будет выдано предупреждающее сообщение. Вообще говоря, недоступный код считается ошибкой программирования, и поэтому предупреждения о таком коде следует воспринимать всерьез. Конструкторы В приведенных выше примерах программ переменные экземпляра каждого объекта типа Вп11о1пд приходилось инициализировать вручную, используя, в частности, следующую последовательность операторов: Ьоояе.оссорапгя 4; Ьоняе.кгеа = 2500; Ьоояе.Г1оогя = 2) Такой прием обычно не применяется в профессионально написанном коде С().
Кроме того, он чреват ошибками (вы можете просто забыть инициализировать одно из полей). Впрочем, существует лучший способ решить подобную задачу: воспользоваться конструктором. Конструктор инициализирует объект при его создании. У конструктора такое же имя, как и у его класса, а с точки зрения синтаксиса он подобен методу. Но у конструкторов нет возвращаемого типа, указываемого явно. Ниже приведена общая форма конструктора. доступ имя класса(список параметров) ( // тело конструктора ) Глава 6, Введение в классы, объекты и методы 163 Как правило, констру«тор используется для задания первоначальных значений переменных экземпляра, определенных в классе, или же для выполнения любых других установочных процедур, которые требуются для создания полностью сформированного объекта.