Г. Шилдт - С# 3.0 Полное руководство. 2010 (1160798), страница 60
Текст из файла (страница 60)
Тем ие менее добиться желаемого результата все же можно, объявив один из аксессоров автоматически реализуемого свойства как рг1чаге. В качестве примера ниже приведено 308 Часть ). Язык С№ объявление автоматически реализуемого свойства ьепдс]т для класса Га115оГЕАггау, которое фактически становится доступным только для чтения. риЫгс гпг Ьепдгъ ( дег; рггнаге вег) ) Свойство Ьепдсд может быть установлено только из кода в его классе, поскольку его аксессор зес объявлен как ргЬнасе. А изменять свойство Ьепдсд за пределами его класса ие разрешается.
Это означает, что за пределами своего класса свойство, по существу, оказывается доступным только для чтения. Аналогичным образом можно объявить и свойство Еггог, как показано ниже. риЫЬс Ьоо1 Еггог ( дегт рг1наге аег) ) Благодаря атому свойство Еггог становится доступным для чтения, ио ие для устаиовки за пределами класса Га115оггдггау. Для опробования автоматически реализуемых вариантов свойств ьепдгп и еггог в классе Гаг15о Ггдггау удалим сначала переменные 1еп и еггГ1ад, поскольку сии больше ие нужны, а затем заменим каждое применение переменных 1еп и ЕггГ1ад свойствами Ьепдсв и Еггог в классе Га№15оГГАггау. Ниже приведен обновленный вариант класса Гаг15оГСАггау вместе с методом Маъп (), демонстрирующим его применение. // Применить автоматически реализуемые и доступные // только для чтения свойства Ьепдгв и Еггог.
изгпд Буягесы с1азз Га115оГСАггау ( Ьпг(] а; // ссылка ка базовый массив // Построить массив по заданному размеру. риы1с Га115огсдггау(1пс вгге) а пем гпг(ягге]; Ьепдгв яггет ) // Автоматически реализуемое и доступное только // дпя чтения свойство Ьепдгв. риЫгс гпг Ьепдгъ ( дест ргънаге гег) // Автоматически реализуемое и доступное только // для чтения свойство Еггог. риЫгс Ьоо1 Еггог ( дег; рг1наге аегт ) // Зто индексатор ддя массива Га115оггаггау.
риЫЬс гпг СИя[гпг Ьпбех] ( // Зто аксессор дег. дес ( ЬГ(ох Ькпбех)) ( Еггог = Га1яет гегигп а[гпбех]) ) е1ве ( Еггог = Сгиет гесигп 0; ) Глава )О. Индексаторы и свойства 309 // Зто аксессор зег. вег ( гс(о)с(йпс(ех)) ( а[гпбех] = ча1це; Еггог = га1ае; е1ве Еггог = Стоек ) ) // Возвратить логическое значение Ггое, если // индекс находится в установленных границах. рг1часе Ьоо1 ох(1пк Епбех) ( Ег(йпбех >= О ь 1пбех < ьепсгь) гетогп ггцет гетцгп Га1вет ) ) О Продемонстрировать применение усовершенствованного // отказоустойчивого массива. с1азв Гйпа1Г5пешо ( вкагкс чогб Ма1п() ( Га115огсаггау гз = печ Га115оггаггау(5)т // Использовать свойство Еггог.
Гог(йпс г От 1 < Гв.ъепдсп ь 1т 1++) гв[1] 1*10) 1Г(кв.Еггог) Сопво1е.игксеъкпе("Ошибка в индексе " + 1)т Этот вариант класса Гак 15 о Ггдггау действует таким же образом, как и предыдущий, но в нем отсутствуют поддерживающие поля, объявляемые явно. На применение модификаторов доступа в аксессорах накладываются следующие ограничения.
Во-первых, действию модификатора доступа подлежит только один аксессор; вес или сес, но не оба сразу. Во-вторых, модификатор должен обеспечивать более ограниченный доступ к аксессору, чем доступ на уровне свойства или индексатора. И наконец, модификатор доступа нельзя использовать при объявлении аксессора в интерфейсе или же при реализации аксессора, указываемого в интерфейсе.(Подробнее об интерфейсах речь пойдет в главе 12.) Применение индексаторов и свойств В предыдущих примерах программ был продемонстрирован основной принцип действия индексаторов и свойств, но их возможности не были раскрыты в полную силу. Поэтому в завершение этой главы обратимся к примеру класса еапседггау, в котором индексаторы и свойства используются для создания типа массива с пределами индексирования, определяемыми пользователем. 310 Часть (.
Язык С№ Как вам должно быть уже известно, индексирование всех массивов в С№ начинается с нуля. Но в некоторых приложениях индексирование массива удобнее начинать, с любой произвольной точки отсчета: с 1 или даже с отрицательного числа, например от -5 и до 5. Рассматриваемый здесь класс Напдедггау разработан таким образом, чтобы допускать подобного рода индексирование массивов. Используя класс напяедггау, можно написать следующий фрагмент кода: Напдеаггау га пен Напдеаггау(-5, 10)) // массив с индексами от -5 до 10 гог(1пг 1=-5) 1 <= 10; 1++) га(1] 1; // индексирование массива от -5 до 10 Нетрудно догадаться, что в первой строке этого кода конструируется объект класса Напдедггау с пределами индексирования массива от -5 до 10 включительно.
Первый аргумент обозначает начальный индекс, а второй — конечный индекс. Как только объект га будет сконструирован, он может быть проиндексирован как массив в пределах от -5 до 10. Ниже полностью приведен класс Напдедггау вместе с классом Напдедггаупешо, в котором демонстрируется индексирование массива в заданных пределах. Класс Напчедггау реализован таким образом, чтобы поддерживать массивы типа гпг, но при желании можете изменить этот тип на любой другой. /* Создать класс со специально указываемыми пределами индексирования массива. Класс НапЧеаггау допускает индексирование массива с любого значения, а не только с нуля. При создании объекта класса Напдеаггау указываются начальный и конечный индексы. допускается также указывать отрицательные индексы.
Например, можно создать массивы, индексируемые от -5 до 5, от 1 до 10 или же от 50 до 56. */ ця1пч Зузкешт с1азв Напчелггау ( // Закрытые данные. гпс[) а; // ссылка на базовьпт массив гпс 1онегВоцпб) // наименьший индекс ьпс цррегВоцпбт // наибольший индекс // Автоматически реализуемое и доступное только для // чтения свойство Ьепссп. рцьгъс гпг ьепчгь ( дегт ргтчаге вест ) // Автоматически реализуемое и доступное только для // чтения свойство Бггог. рцЬ11с Ьоо1 Еггог ( чес) рггчасе вест // Построить массив по заданному размеру. рцв11с НапОЕАггау(гпк 1он, 1пс Ь1дь) ( Ь10Лььт ьд(Ь10Ь < 1он) ( Сопяо1е.иггсевгпе("Неверные индексы"); Ь10Ь 1) // создать для надежности минимально допустимый массив )он = От ) Глава )О.
Иидексаторы и свойства 311 а = пен тпт(дадЬ вЂ” 1он) Ьепдсп = Ьудп — 1онт 1онегвоипб = 1он) иррегВоипб = — ЬЬОЬ) ) // Это индексатор для класса Вапдедгтау. риЬ11с Ьпт Гдаз[тпт тпбех) ( // Это аксессор дег. дег ( 15(ол(1пбех) ) ( Егтот = та1зе; геситп а[тпбех — 1онетВоипй)т ) е1яе ( Егтог = Гтиет гегигп От ) ) // Это аксессор зет. зет ( 1С(ок(апс(ех)) ( а[1пбех — 1онегВоипб) = ча1иет Еггог = Ка1зет е1зе Еггог Ггиет ) ) // Возвратить логическое значение Ггие, если // индекс находится в установленных границах. ртгиасе ьоо1 ох(1пг тпбех) ( 1т(1пк(ех > 1оиегвоипб в тпбех <= ирретВоипб) гегигп гтие; гегигп Са1зет ) ) // Продемонстрировать применение массива с произвольно // задаваемыми пределами индексирования.
с1азз ВапдеАггауПеио ( втатгс чокб Матп() ( Яапдеаттау га пен Капдеатгау(-5, 5)) Вапдеаггау га2 = пен Еапдеагтау(1, 10)т Вапдеагтау гаЗ = пеи Яапдеаттау(-20, -12)т // Использовать объект га в качестве массива. Сопзо1е.иг Седале("длина массива га: " + та.ЬепдГЬ); сот(тпт т = -5т г <= 5т 1ьь) та[1) 1; Сопзо1е.Юггте("Содержимое массива та: ")т вот(апт т = -5т т <= 5т 1т+) 312 часть ). язык С» Сопзо1е.нг1ге(га(1) + " "); Сопзо1е.нг1ке11пе("1п") // Использовать объект га2 в качестве массива. Сопао1е.нггкеагпе("длина массива га2: " + га2.ъепдГП) бог(1пк 1 = 14 1 <= 10; 14+] га2(1) = 14 Сопво1е.иг1ге("Содержимое массива га2: "); Еог(апк 1 = 1) 1 <= 10; 1++) Сопзо1е.Иг).ке(га2!1) + " ")' Сопао1е.Игггевгпе("тп")т // Использовать объект гаЗ в качестве массива.
сопво1е.иг1геь1пе("длина массива гаЗ: " + газ.ьепдгп) тог(1пк 1 = -20; 1 <= -124 144) гаЗ(1) = 14 Сопао1е.итаке("Содержимое массива гаЗ: "); Гог(апг 1 = -204 1 <= -124 1++) Сопзо1е.Иг).ке(гаЗ(1) ь " ")т Сопао1е.иг1кеагпе("М")) ) ) При выполнении этого кода получается следующий результат: длина массива га: 11 Содержимое массива га: -5 -4 -3 -2 -1 0 1 2 3 4 5 Длина массива га2: 10 Содержимое массива га2: 1 2 3 4 5 б 7 8 9 10 Длина массива гаЗ: 9 Содержимое массива гаЗ: -20 -19 -18 -17 -1б -15 -14 -13 -12 Как следует из результата выполнения приведенного выше кода, объекты типа напчейггау можно индексировать в качестве массивов, начиная с любой точки отсчета, а не только с нуля. Рассмотрим подробнее саму реализацию класса напцейггау.