Г. Шилдт - С#4.0 Полное руководство (1160795), страница 43
Текст из файла (страница 43)
Но в любом случае метод доЛжен возвратить наименьшее из этих значений. Такой метод нельзя создать, используя обычные параметры. Вместо этого придется воспользоваться специальным типом параметра, обозначающим произвольное число параметров. И это делается с помощью создаваемого параметра типа рагавя. Для объявления массива параметров, способного принимать от нуля до нескольких аргументов, служит модификатор рагавя.
Число элементов массива параметров будет равно числу аргументов, передаваемых методу. А для получения аргументов в программе организуется доступ к данному массиву. Ниже приведен пример программы, в которой модификатор рагавя используется для создания метода Мгпча1 ( ), возвращающего наименьшее среди ряда заданных значений. Продемонстрировать применение модификатора рвгввя. оягпе Буягев) с1аяя Мгп ( роЬ11с 1пг М1пуа1(рвгашв ьпя() повя) ( ьпг. го 11(повн.ьепесп == 0) Сопяо1е.нг1яещпе("Ошибка: нет аргументов.") гегогп 0; ) в = повя(0)г гог(ьпг 1=1) 1 < повя.ьепчяп) 11(повя(1) < в) в = повя(1); гегогп в; с1азя РвгавяОево ( ясаягс чо1б Ма1п() ( Мьп оЬ = пен Мтп(); 1пя вгп) 1пс а = 10, Ь = 20; Вызвать метод с двумя значениями.
вгп = оЬ.Мьпча1 (а, Ь) г Сопво1е.игтяеььпе("Наименьшее значение равно " + в1п) Вызвать метод с тремя значениями. вьп = оЬ .М1пуа1 (а, Ь, -1 ) ) 230 Часть (. Язык С() Сопво1е.иг1певьпе("Наименьшее значение равно " ь шьп) // Вызвать метод с пятью значениями. шгп = оЬ.Мьпуа1(18, 23, 3, 14, 25); Сопао1е.нгьгеььпе("Наименьшее значение равно " 4 шьп) Вызвать метод с массивом целых значений. ьпь() агЧв = ( 45, 67, 34, 9, 112, 8 ); шгп = оЬ.Мгпуа1(агчв)/ Сопво1е.игзьеььпе("Наименьшее значение равно " + шьп) При выполнении этой программы получается следующий результат. Наименьшее значение равно 10 Наименьшее значение равно -1 Наименьшее значение равно 3 Наименьшее значение равно 8 Всякий раз, когда вызывается метод МзпЧа1 (), ему передаются аргументы в массиве пцшз.
Длина этого массива равна числу передаваемых аргументов. Поэтому с помощью метода М1пЧа1 () можно обнаружить наименьшее среди любого числа значений. Обратите внимание на последний вызов метода М1пЧа1 () . Вместо отдельных значений в данном случае передается массив, содержащий ряд значений. И такая передача аргументов вполне допустима.
Когда создается параметр типа рагашз, он воспринимает список аргументов переменной длины или же массив, содержащий аргументы. Несмотря на то что параметру типа рагашз может быть передано любое число аргументов, все они должны иметь тип массива, указываемый этим параметром. Например, вызов метода мзпча1 ( ) шьп = оЬ.Мьпуа1(1, 2.2); // Неверно! считается недопустимым, поскольку нельзя автоматически преобразовать тип с)оцЬ1е (значение 2.2) в тип 1п с, указанный для массива пцшв в методе МЫЧа 1 ( ) .
Пользоваться модификатором рагашв следует осторожно, соблюдая граничные условия, так как параметр типа рагашв может принимать любое число аргументов— даже нулевое! Например, вызов метода М1пЧа1 () в приведенном ниже фрагменте кода считается правильным с точки зрения синтаксиса С)). ш1п = оЬ.М1пЧа1(); // нет аргументов шгп = оЬ.Мьпуа1(3); // 1 аргумент Именно поэтому в методе М1пЧа1 () организована проверка на наличие в массиве витя хотя бы одного элемента перед тем, как пытаться получить доступ к этому элементу. Если бы такой проверки не было, то при вызове метода МзпЧа1 () без аргументов возникла бы исключительная ситуация во время выполнения. (Подробнее об исключительных ситуациях речь пойдет в главе 13.) Больше того, код метода мзпча1 ( ) написан таким образом, чтобы его можно было вызывать с одним аргументом.
В этом случае возвращается этот единственный аргумент. У метода могут быть как обычные параметры, так и параметр переменной длины. В качестве примера ниже приведена программа, в которой метод НЬоыАгов () Глава 8. Подробнее о методах и классах 231 принимает один параметр типа ягг1пд, а также целочисленный массив в качестве параметра типа рагавя. // Испольэовать обычный параметр вместе с параметром // переменной длины типа рагавя. цяьпд Яуясев; с1аяя МуС1аяя ( рцььлс чоьб ялонлгоя(ясглпо вяя, рагавя ьпг() пцвя) ( Сопяо1е.нг1се(вяо + ": "); Гогеасл(1пс 1 ьп пцвя) Сопяо1е.Хт1се(1 + " ") Сопяо1е.Хтлге11пе (); с1аяя Ратавяоево2 ( ягаоьс чоьд Маьп() ( МуС1аяя оЬ = пен МуС1аяя (): оЬ.ЯЬонлтчя("Это ряд целых чисел", 1, 2, 3, 4, 5); оЬ.ЯЬонлтдя("А это еве два целых числа 17, 20); Вот какой результат дает выполнение этой программы. Это ряд целых чисел: 1, 2, 3, 4, 5 А это еые Даа цеЛЫХ чИСЛа: 17, 20 В тех случаях, когда у метода имеются обычные параметры, а также параметр переменной длины типа ра гав я, он должен быть указан последним в списке параметров данного метода.
Но в любом случае параметр типа ра гавя должен быть единственным. Возврат объектов из методов Метод может возвратить данные любого типа, в том числе и тип класса. Ниже в качестве примера приведен вариант класса йесг, содержащий метод Еп1агце (), в котором строится прямоугольник с теми же сторонами, что и у вызывающего объекта прямоугольника, но пропорционально увеличенными на указанный коэффициент. // Воэвратить объект иэ метода. ця1пд Яуясев; с1аяя Весь ( ьпг н1оСЬ; лпг ЬеьВЬЮ 232 Часть!.
Язык С№ рцЬ11с Ресг(1пс н, гпс Ь) ( нгСТЬ = н; Ье 0ЬТ = Ь! ) рцЬ1тс тпС Агеа() ( гепцгп нгбСЬ * ЬегдЬТ; ) рсЬ11с чогб ЕЬон() ( СОПЭО1Е.ХГ1ТЕЬ1ПЕ(НТССЬ + " " + ЬЕ10ЬС) ) /* Метод возвращает прямоугольник со сторонами, пропорционально увеличенными на указанный коэффициент по сравнению с вызывающим обьектом прямоугольника. */ рцЬ11с ВесТ Еп1асэе(гпС Гаспог) гетцсп пем Весс(н1г)сь * гассет, ьеьчьс * гассог)г с1авэ ВеСОЬ2 ( эСаТ1с чо1г( Ма1п() ( Весо г1 = лен Весп(4, 5) Сопэо1е.ХТ1Се("Размеры прямоугольника Т1: Т1.БЬон()) сопэо1е.хгссеьгпе("площадь прямоугольника Т1: " ь Т1.Агеа())1 Сопэо1Е.ХТТТе11пе() // Создать прямоугольник в два раза больший прямоугольника г1. Весг г2 = г1.ЕЬ1агче(2)г сопэо1е.хсгсе("Размеры прямоугольника г2: ")) Т2.8Ьон()г Сопэо1е.игьтеъьпе("Площадь прямоугольника Т2: " + Т2.АГеа())г ) Выполнение этой программы дает следующий результат.
Размеры прямоугольника Т1: 4 5 Площадь прямоугольника Т1: 20 Размеры прямоугольника г2: 8 10 Площадь прямоугольника г2: 80 Когда метод возвращает объект, последний продолжает существовать до тех пор, пока не останется ссылок на него. После этого он подлежит сборке как "мусор".
Следовательно, объект не уничтожается только потому, что завершается создавший его метод. Глава 8. Подробнее о методах и классах 233 Одним из практических примеров применения возвращаемых данных типа объектов служит фабрика класса, которая представляет собой метод, предназначенный для построения объектов его же класса.
В ряде случаев предоставлять пользователям класса доступ к его конструктору нежелательно из соображений безопасности или же потому, что построение объекта зависит от некоторых внешних факторов. В подобных случаях для построения объектов используется фабрика класса. Обратимся к простому примеру. // Использовать фабрику класса. пв1пд Вуягев) с1аяя МуС1авя гпг а, Ь; // закрытые члены класса // Создать фабрику длв класса Мус1авв. роьггс Мус1аяв Гассогу(гпг 1, гпг 1) ( МуС1авя С вЂ” пеи МуС1авв (); с.а = гг с.ь гесогп Г; // возвратить объект ! роЬ11с чогг( ЯЬои() ( сопво1е.иггбеьгпе("а и ь: " е а т " " е ь); ! ) сгаяя МакеОЬбесгв ( ягас1с чо1б Ма1п() ( МуС1авя оЬ = пею Мус1аяя()г гпв // Сформировать объекты, используя фабрику класса. Еог(1=0, 9=10; 1 < 10г 1т+, 1 †) ( МуС1авя апоСЛегбь = оЬ.Гасвогу(1, 1); // создать объект апосьегбь.зьои(); ) Сопяо1е.нгггеъзпе()) ) ) Вот к какому результату приводит выполнение этого кода.
аиь! 010 аиЬ; 19 аиЬ: 2 В аиь: зт аиЬ: 4 б аиЬ: 55 аиЬ: 64 234 Часть (. язык С(г аиЬ: 73 аиЬ:82 аиЬ: 9 1 Рассмотрим данный пример более подробно. В этом примере конструктор для класса МуС1аяя не определяется, и поэтому доступен только конструктор, вызываемый по умолчанию. Это означает, что значения переменных а и Ь нельзя задать с помощью конструктора. Но в фабрике класса Гассогу () можно создать объекты, в которых задаются значения переменных а и Ь.
Более того, переменные а и Ь являются закрытыми, и поэтому их значения могут быть заданы только с помощью фабрики класса Гасгогу () . В методе Мауп () получается экземпляр объекта класса МуС1аяя, а его фабричный метод используется в цикле Гог для создания десяти других объектов. Ниже приведена строка кода, в которой создаются эти объекты.
Му01аяя апоГЬегОЬ = оЬ.Гассогу(1, 1)г // созДать объект На каждом шаге итерации цикла создается переменная ссылки на объект апогпегОЬ, которой присваивается ссылка на объект, формируемый фабрикой класса. По завершении каждого шага итерации цикла переменная апогйегОЬ выходит за пределы области своего действия, а объект, на который она ссылается, утилизируется. Возврат массива из метода В С() массивы реализованы в виде объектов, а это означает, что метод может также возвратить массив. (В этом отношении Ся отличается от С++, где не допускается возврат массивов из методов.) В качестве примера ниже приведена программа, в которой метод ГупбГасгогя () возвращает массив, содержащий множители переданного ему аргумента.