* При перепечатке материалов ссылка на www.SeoLiga.ru обязательна!
Свойства-наборы
8 февраля 2009
Если объект должен предоставлять доступ к набору однотипных элементов, число которых заранее неизвестно, можно сделать этот набор доступным через свойство объекта. Сделав набор объектов доступным через свойство класса, вы сможете упра- влять доступом к этим объектам и проверять значения, которые записываются в это свойство.
Реализуют свойство- набор по-разному. Выбор способа зависит от необходимой функциональности. Простое свойство-набор возвращает набор объектов, при этом клиент может добавлять и удалять элементы из набора, а также вызывать любые методы набора. Чтобы запретить клиенту запись в свойство- набор новых экземп- ляров этого класса набора, сделайте это свойство доступным только для чтения - это не препятствует модификации объектов набора посредством его методов, Вот пример простого свойства-набора: Visual Basic .NET Private Readonly mWidgets As New System. Collections. ArrayListO Public Readonly Property WidgetsO As System. Collections. ArrayList Get Return mWidgets End Get End Property Visual C# private readonly System. Collections. ArrayList mWidgets = new System. Col lections. ArrayListO; public System. Collections. ArrayList Widgets { ':'' { return mWidgets; } ! Хотя этот способ прост и позволяет получать доступ к элементам набора, у него есть один существенный недостаток. Большинство наборов, представленных клас- сами из пространства имен System. Collections, прини мает и возвращает свои элемен- ты в виде объектов типа Object. Это означает, что можно добавить в набор (или уда- лить из него) объект любого типа. Иными словами, при добавлении к набору новых элементов проверка типов не выполняется, а возвращаемые элементы набора необ- ходимо явно приводить к нужному типу. Впрочем, если свойство должно работать с разнородными объектами, этот подход приемлем. Для создания простого свойства-набора достаточно реализовать доступное толь- ко для чтения свойство, возвращающее нужный набор. Чтобы получить свойство-набор, более устойчивое к ошибкам, следует сделать набор доступным через свойство и написать код, выполняющий явное преобразо- вание типов и проверку значений, присваиваемых свойству. Это позволит получать из набора элементы с заданным индексом и проверять типы помещаемых в него объектов. Такое свойство в Visual Basic .NET реализуют в виде параметризованного свойства, например, так: Visual Basic .NET Private mWidgets as New System.Collections,ArrayListO Public Property Widget(I As Integer) As Widget Get Return CType(mWidgets(I), Widget) End Get Set(ByVal Value As Widget) mWidgets(I) = Value End Set End Property Visual C# не поддерживает параметризованные свойства, поэтому при исполь- зовании этого языка такие свойства реализуют как индексаторы либо в виде пары специальных методов (см. пример кода далее). Visual C# private System.Collections,ArrayList mWidgets = new System. Col lections. ArrayListO; public Widget GetWidget{int I) I return (Widget)mWidgets[I]; ) public void SetWidget(int I, Widget Wid) { mWidgets[I] = Wid; ! Аналогичным образом создают строго типизированные свойства, открывающие доступ к набору однотипных элементов, однако этот способ не лишен недостатков. Например, при его использовании нельзя применять оператор For Each...Next (foreach) для перебора элементов набора в цикле, а для всех методов данного свойства, которые должны быть доступными клиенту, потребуется написать оболочку. Нако- нец, в этом случае невозможны некоторые отступления от правил синтаксиса, раз- решенные в Visual C#. >• Как создать свойство-набор с проверкой типов • в Visual Basic .NET для этого следует создать параметризированное свойство, воз- вращающее элемент закрытого (private) набора, заданный индексом, и написать код, преобразующий возвращаемый объект в требуемый тип при помощи функ- ции СТуре; • в Visual C# для этого необходимо создать пару методов, получающих и устанав- ливающих элемент закрытого набора, заданный индексом, причем метод ^дол- жен явно приводить возвращаемый объект к требуемому типу. Чтобы создать свойство с еще более строгой реализацией, можно объявить соб- ственный класс строго типизированного набора на основе класса System. Collections. Collection Base. Этот класс предоставляет основную функциональность, необхо- димую для обслуживания наборов, позволяя создавать собственную реализацию для свойства item. Созданный таким образом строго типизированный набор удается сде- лать доступным непосредственно через свойство (этот прием проиллюстрирован в приведенном выше примере); при этом вся функциональность наборов останется доступной. Помимо приема только элементов заданного типа, такой набор поддер- живает любую другую необходимую функциональность. Наследование рассматри- вается в деталях в главе 4, там же вам предлагается упражнение с примером, иллю- стрирующим создание строго типизированного набора. Резюме • Свойства открывают доступ к членам класса (переменным и объектам), позво- ляют создавать код, проверяющий значение свойства при обращении к нему и выполняющий ряд других действий. Свойства, доступные только для чтения или только для записи, позволяют ограничить доступ клиента к свойствам чтением или записью. Visual Basic .NET также позволяет создавать свойства, принимаю- щие параметры и возвращающие диапазоны значений. • К значению свойства по умолчанию разрешено обращаться, не указывая имя этого свойства. Такие свойства должны быть параметризированными. В Visual С# эквивалентом свойств по умолчанию являются индексаторы. • Свойства-наборы открывают доступ к группам объектов, поддерживаемых клас- сом. Предусмотрено несколько способов реализации подобных свойств, каждый из них обладает своими достоинствами и недостатками: • простейшее свойство-набор, возвращающее объект-набор из закрытой пере- менной; этот способ наименее устойчив к ошибкам; • свойство, возвращающее элемент закрытого набора с заданным индексом. Этот вариант более устойчив к ошибкам, но менее гибок; • класс строго типизированного набора. Применение этого способа требует от разработчика наибольших усилий, обеспечивая взамен доступ к строго типи- зированным наборам. Этот способ максимально устойчив к ошибкам.