Г. Шилдт - С# 3.0 Полное руководство. 2010 (1160798), страница 40
Текст из файла (страница 40)
бо ( пехсб101Г = пцш $10) п[пцшбгйьгз] = пехгб101гт ппшб1Я1сз+ь; пцш = пош / 10; ) мп11е(пцш > 0)т пошб1Я 1 Г з // Вывести полученные слова. Гог(; пцшбгягсз >= 0; пошбзязкз--) Сопзо1е.нгзсе(б101гз[п[пцшб101гз]) + " ")т Сопзо1е.Игзсеь1пе()) ) глава 7, массивы и строки 199 Выполнение этой программы приводит к следующему результату: число: 1808 число словами: один девять нуль восемь В данной программе использован массив строк с(фд1СЯ для хранения словесных эквивалентов цифр от 0 до 9. По ходу выполнения программы целое число преобразуется в слова. Для этого сначала получаются отдельные цифры числа, а затем они сохраняются в обратном порядке следования в массиве и типа 1пс. После этого выполняется циклический опрос массива и в обратном порядке. При этом каждое целое значение из массива и служит в качестве индекса, указывающего на слова, соответствующие полученным цифрам числа и выводимые как строки. Постоянство строк Как ни странно, содержимое объекта типа вьг1пд не подлежит изменению.
Это означает, что однажды созданную последовательность символов изменить нельзя. Но данное ограничение способствует более эффективной реализации строк. Поэтому этот, на первый взгляд, очевидный недостаток на самом деле превращается в преимущество. Так, если требуется строка в качестве разновидности уже имеющейся строки, то для этой цели следует создать новую строку, содержащую все необходимые изменения. А поскольку неиспользуемые строковые объекты автоматически собираются в "мусор", то о дальнейшей судьбе ненужных строк можно даже не беспокоиться. Следует, однако, подчеркнуть, что переменные ссылки на строки подлежат изменению, а следовательно, они могут ссылать на другой объект. Но содержимое самого строкового объекта не меняется после его создания.
Для того чтобы стало понятнее, почему неизменяемые строки не являются помехой, воспользуемся еще одним методом обращения со строками: ЯиЬвсгъпд() . Этот метод возвршцает новую строку, содержащую часть вызывающей строки. В итоге создается новый строковый объект, содержащий выбранную подстроку, тогда как исходная строка не меняется, а следовательно, соблюдается принцип постоянства строк. Ниже приведена рассматриваемая здесь форма метода ЯпЬвсгв пд () .
всгкпд Яиьвсг1пд(1пс начало, апг длина) где начало обозначает начальный индекс исходной строки, а длина — длину выбираемой подстроки. Ниже приведена программы, в которой принцип постоянства строк демонстрируется на примере применения метода ЯоЬвьгфпд () . // Применить метод ЯнЬвкгапд() ив1пд Яувквщ> с1авв Яипзсг ( всак1с нскс( Ивъп() ( вкгапд сгдвкг = "В СВ упрощается обращение со стрскамн." // сформировать подстроку Вкг1Пд ВпЬвсг = Скдякг.ЯнЬвгг1Пд(5 20)т Сспвс1в.нгксеътпе("сгдвггк " + сгдвсг)т Сспво1в.игаквьапе("впЬвсгк " + впЬвгг)т ) 200 часть ).
Язык С№ Вот к какому результату приводит выполнение этой программы; огззсгс В Са упрощается обращение со строками. япЬясгс упрощается обращение Как видите, исходная строка из переменной огдягг не меняется, а выбранная из нее подстрока содержится в переменной япЬятг. И последнее замечание: несмотря на то, что постоянство строк обычно не является ни ограничением, ни помехой для программирования на С№, иногда оказывается полезно иметь возможность видоизменять строки.
Для этой цели в С№ имеется класс Ясг1пдВо11с)ег, который определен в пространстве имен яуягещ.техг. Этот класс позволяет создавать строковые объекты, которые можно изменять. Но, как правило, в программировании на С№ используется тип ягг1пс3, а не Ятг1псзпи11с[ег. Применение строк в операторах ви~йсп Объекты типа ясг1пд могут использоваться для управления оператором зн1гсЬ. Это единственный нецелочисленный тип данных, который допускается применять в операторе ян1гсЬ.
Благодаря такому применению строк в некоторых сложных ситуациях удается найти более простой выход из положения, чем может показаться на первый взгляд. Например, в приведенной ниже программе выводятся отдельные цифры, соответствующие словам "один", "два" и "три". // Продемонстрировать управление оператором змгссь О посредством строк. пвгпч Яуягесп) сгаяя Ясггпззнгссп ( згаггс тогй маги() ( ясггпд П ясгз = ( "один", "два", "три", "два", "один" )) Гогеасп(ясггпд в 1п ясгв) ( янггсь(я) ( саяе "олин": Сопяо1е.иггсе(1)) Ьгеахт саяе "два"с Сопзоге.иггсе(2)) Ьгеа)ст саяе "три"с Сопяо1е.иггсе(3)т Ьгеа)с) Сопяо1е.иггсеъгпе()т При выполнении этой программы получается следующий результат: 12321 ГЛАВА Подробнее о методах и классах в данной главе возобновляется рассмотрение классов и методов.
Оно начинается с пояснения механизма управления доступом к членам класса. А затем обсуждаются такие вопросы, как передача и возврат объектов, перегрузка методов, различные формы метода маъп (), рекурсия и применение ключевого слова э вась с. Управление доступом к членам класса Поддержка свойства инкапсуляции в классе дает два главных преимущества. Вопервых, класс связывает данные с кодом. Это преимушество использовалось в предыдуших примерах программ, начиная с главы 6.
И во-вторых, класс предоставляет средства для управления доступом к его членам. Именно эта, вторая преимущественная особенность и будет рассмотрена ниже. В языке СФ, по существу, имеются два типа членов класса: открытые и закрытые, хотя в действительности дело обстоит немного сложнее. Доступ к открытому члену свободно осуществляется из кода, определенного за пределами класса.
Именно этот тип члена класса использовался в рассматривавшихся до сих пор примерах программ. А закрытый член класса доступен только методам, определенным в самом классе. С помощью закрытых членов и организуется управление доступом. Ограничение доступа к членам класса является основополагающей частью объектноориентированного программирования, поскольку оно позволяет исключить неверное использование объекта.
Разрешая доступ к закрытым данным только с помощью строго определенного ряда методов, можно предупредить присваивание неверных значений этим данным, выполняя, например, проверку диапазона представления чисел. Для закрытого члена класса нельзя задать значение непосредственно в коде за пределами класса. Но в то же время можно полностью управлять тем, как и когда данные используются в объекте.
Следовательно, правильно реализованный класс образует некий "черный ящик", которым можно пользоваться, но внутренний механизм его действия закрыт для вмешательства извне. 202 Часть!. Язык С() Модификаторы доступа Управление доступом в языке С(т организуется с помощью четырех модификаторов доьтвула: рпЫ1с, рг1чаге, ргогесСет( и гпгегпа1. В этой главе основное внимание уделяется модификаторам доступа рвы го и рггчасе. модификатор рго се с сея( применяется только в тех случаях, которые связаны с наследованием, и поэтому речь о нем пойдет в главе 11.
А модификатор 1пеегпа1 служит в основном для сборки, которая в широком смысле означает в С() разворачиваемую программу или библиотеку, и поэтому данный модификатор подробнее рассматривается в главе 16. Когда член класса обозначается спецификатором риЫ1с, он становится доступным из любого другого кода в программе, включая и методы, определенные в других классах. Когда же член класса обозначается спецификатором рг1часе, он может быть доступен только другим членам этого класса.
Следовательно, методы иэ других классов не имеют доступа к закрытому члену (рг1часе) данного класса. Как пояснялось в главе 6, если ни один из спецификаторов доступа не указан, член класса считается закрытым для своего класса по умолчанию. Поэтому при создании закрытых членов класса спецификатор ргг ча се указывать для них необязательно. Спецификатор доступа указывается перед остальной частью описания типа отдельного члена. Это означает, что именно с него должен начинаться оператор объявления члена класса. Ниже приведены соответствующие примеры. рпЬ1гс зггспд еггмядт рг1часе т(опЬ1е Ьа1т ргъчаге Ьоо1 гзвггог(ЬУСе яСагпя) ( // Для того чтобы стали более понятными отличия между модификаторами риЫ1с и рггчаге, рассмотрим следующий пример программы: // Отличия между андами достУпа риЫго и ргьчаге // к членам класса.
пз1пд Яузгею; с1аяя МУС1аяя ( рггчаге гпС а1рпат // доступ рггчаСе, указываемый явно гпС Ьегат // поступ рггчаге по умолчанию рпЫ1о ьпс дапкзат // доступ риЫго // Методы, которым доступны члены а1рьа и Ьега данного О класса. Член класса может иметь доступ к закрытому // члену этого же класса. риЬ1го чо1т( Яега1рпа(1пг а) ( а1рьа = ат ) рпьаьс гпг Оега1рпа() ( геспгп а1рпат риЫьс чо1т( ЯеСВееа(ьпС а) ( Ьеса = а; ) Глава 8, Подробнее о методах и классах 203 1 рпь11с ьпо Оеозеоа() ( гзопгп Ьекат ) с1азз йссеззбещо ( зпаь1с чогб Ма1п() ( МуС1азз оЬ = пеи МуС1азз()т // Доступ к чЛЕНаМ а1рьа и Ьееа данного кпасса // разрешен только посредством его методов.