|
Программирование >> Проектирование интерфейса пользователя
13: MsgBox GetFastGreetingsText( ItEspanol ) 14;End Sub 15: Public Sub GreetingsTechnoid( ) 16: MsgBox GetFastGreetingsText( ItTechnoid) 17:End Sub 18: Private Eunction GetFastGreetingsText(ByVal Language As LanguageType) As String 19: GetEastGreetingsText = Array ( Hello! , Buenos diaz! , 20; Guten tag! )(Language) 21:End Eunction 1 Листинг 21.4 почти идентичен предыдущему, за исключением изменений 1 во внутренней функции класса - теперь она получила название Get-FastGreetingsText. Параметр функции (значение Language перечислимого типа LanguageType) выступает в роли индекса массива, позволяющего заменить громоздкую управляющую структуру Select Case . . . End Case простым и изящным выражением присваивания. Итак, изменения, вносимые в скрытый интерфейс класса, не оказывают влияния на внешний код. Если же исправлениям подвергаются внешние методы класса, потребуется пересмотреть и протестировать код других модулей, в которых содержатся обращения к объектам рассматриваемого класса. Когда создается код класса, вы являетесь производителем, а когда используется класс - пользователем. Помните об этой особенности при создании классов. Даже если вы единственный потенциальный пользователь класса, сделайте его более простым в применении посредством скрытого интерфейса. Определение свойств класса Данные - это то, с чем работает программа. Если информация содержит ошибки, результат окажется неверным. Издавна программисты придерживаются мнения, что данные должны проверяться. Например, произвольная комбинапия пифр не обязательно дает в результате правильную дату, -10 не может быть значением возраста, а 1000 - числом одновременно продаваемых акций компании Microsoft. Эти примеры элементов данных верны далеко не во всех случаях; поэтому информация подлежит проверке. На первых порах для проверки данных использовались функции. К несчастью, такой подход порождал существенные проблемы. Что произойдет, если функции, которая должна проверять корректность информации, в программе просто нет? Либо она не используется? Ведь так велик соблазн избежать лишней работы и пренебречь необходимостью проверки данных, положившись на авось . Решение пришло - в виде концепции свойств и методов Property. Свойства используются для хранения данных в составе класса; им легко по мере необходимости поставить в соответствие специальные методы того же класса, обозначаемые служебным словом Property и предназначенные, в частности, для выполнения автоматической проверки корректности данных. Методы Property обладают собственным уникальным синтаксисом. Один из двух методов используется для чтения значений соответствующего свойства, а другой - для их записи. Листинг 21.5 представляет пример нового класса, в котором определены два свойства, Name и EmailAddress, и соответствующие им пары методов Property. Листинг 21.5. Пример класса Contact, содержащего определения методов Property 1: Option Compare Database 2: Option Explicit 3: Private FName As String 4; Private FEmailAddress As String 5 Property Get Name( ) As String 6 Name = FName 7 End Property 8: Property Let Name { ByVal Value As String ) 9: FName = Value 10:End Property 11:Property Get EmailAddress( ) As String 12: EmailAddress = FEmailAddress 13:End Property 14: Private Sub RaiseError ( ByVal MESSAGE As String ) 15: Call Err. Raise {VbObjectError, Contact , Message) 16:End Sub 17: Private Sub ValidateEmailAddress (ByVal EmailAddress As String) 18: Const Message = Неверный почтовый адрес 19: If (InStr( 1, EmailAddress, 8 ) = 0) Then RaiseError(Message & EmailAddress) 20:End Sub 21: Property Let EmailAddress ( ByVal Value As String ) 22: Call ValidateEmailAddress ( Value ) 23: FEmailAddress = Value 24:End Property I Напомним: чтобы создать класс Contact, код которого приведен в листинге 21.5, следует открыть окно редактора Microsoft Visual Basic и выбрать в меню команду InsertClass Module. Строки 3 и 4 содержат объявления свойств класса - неременных FName и FEmailAddress тина String. Они снабжены квалификатором Private, чтобы исключить возможность непосредственного доступа извне. Мы предлагаем пользователям класса альтерпативп1й вариант - метод1 Property. В строкам 7 размещен текст Property-метода Get для свойства FName. Предположим, что создан объект MyContact класса Contact. Тогда к свойству можно обратиться опосредованно, с помощью конструкции MyContact те. Когда опа употребляется в качестве правостороннего операнда, выз1вается Property-метод Get Name и срабатывает строка кода 6. Строки 8-10 определяют код метода записи, Let. Метод Let выз1вается в том случае, если свойство используется в качестве левостороннего операнда в1ражепия. Следующие строки кода демонстрируют обращение к свойству из левой и правой частей в1ражепия: MyContact.Name = Noah Kimmel MsgBox MyContact.Name Приведенные строки выглядят как обычные обращения к переменной, предполагающие присваивание и использование ее текущего значения (это, собственно, пам и пужпо), по па самом деле при их в1полпепии программа вызывает соответствующие Property-методы, Let и Get. Все, как и ранее, удобно, к тому же, может бгть проведена автоматическая проверка данных. В строках 11-13 и 21-24 содержатся методы Get и Let, обеспечивающие доступ к свойству FEmailAddress. (Обратите внимание, что синтаксис аналогичен рассмотренному выше. Property-метод Get оформляется в виде функции, возвращающей зпаче- ние требуемого типа, а Let имеет структуру процедуры, которой пере- даются аргументы.) Строка 22 демонстрирует, как данные, которые предполагается присвоить переменной FEmailAddress, подвергаются незаметной для пользователя проверке. Следующая строка иллюстрирует возможную операцию присваивания: MyContact.EmailAddress = pkimmel@hotmail.com В этот момент выполняется код строки 22, вызывающей процедуру ValidateE-которой передается значение параметра (Обратите внимание, что процедура ValidateEmailAddress объявлена выше, в строках 17-20, как скрытый (Private) член класса.) Если результат проверки успешен, в строке 23 значение присваивается внутренней переменной FEmailAddress. Методы Property, будучи простыми в использовании, предоставляют широкие возможности управления данными. Вы можете построить только те конструкции проверки, которые отвечают природе конкретного элемента данных, и сосредоточить их компактно, внутри соответствующего метода Property. Еще одно преимущество механизма обращения к свойствам класса посредством методов Property состоит в том, что они позволяют ограничить круг возможных операций, выполняемых со свойством. Например, чтобы обеспечить доступ к переменной только по чтению, достаточно просто забыть об определении соответствующего метода Let. Если же необходимо, чтобы пользователь, наоборот, мог только присваивать значения, но не считывать их, следует отказаться от построения метода Get. Создавая класс, объявляйте все свойства с помощью квалификатора Private, а для доступа к ним предлагайте пары соответствующих методов Get и Let. Концепция методов Property весьма эффективна, и именно благодаря ей получили развитие средства визуального программирования и быстрой разработки приложений. Использование свойств объектов Среди свойств классов могут быть как переменные простых типов, так и объекты других классов. Конструкция объявления метода Property, используемого для чтения содержимого переменной простого типа или объекта, снабжается служебным словом Get. При создании Property-методов, предназначенных для присваивания значений свойствам простых типов, используется служебное слово Let. Но его нельзя употреблять, если речь идет о свойстве, представляющем собой объект класса. В этом случае применяется служебное слово Set. Таким образом, Set заменяет Let в тех случаях, когда в качестве свойства используется объект класса. Например, чтобы построить несколько Property-методов для доступа к свойству, представляющему собой объект класса Collection, следует употребить служебные слова Get и Set. Статические свойства Создавая класс, вы определяете пользовательский тип. Построив экземпляр класса, вы получаете объект этого типа. Каждый объект обладает собственным набором всех элементов данных (свойств) и методов класса. Поэтому для двух объектов класса Contact - скажем, MyContact и YourContact - выражения MyContact.Name и YourCon-tact .Name будут ссылаться, как правило, на два совершенно разных элемента данных. Разница между классами и объектами примерно такая же, как между и клонами. ДНК - это набор генов, а каждый отдельный набор генов - это клон. Класс - это ДНК, а объект - клон.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |