Классы и объекты
Эта глава
вместе с главами 5 и 6 занимает центральное место в книге. Причины просты: язык
VB .NET стал первой объектно-ориентированной версией VB, и тот, кто недостаточно
хорошо разбирается в ООП, не сможет в полной мере использовать новые возможности
VB .NET. Вероятно, это утверждение вас удивило — ведь возможность определения
классов и создания объектов на их основе появилась еще в VB4. Чем же VB .NET
так отличается от своих предшественников, что вам придется полностью переосмыслить
свой стиль программирования? Развернутый ответ на этот вопрос приводится в этих
трех главах.
За время
преподавательской работы у нас сложилось впечатление, что большинство программистов
VB почти не использовали средства ООП в предыдущих версиях Visual Basic. Это
объяснялось как неудобной и плохо проработанной реализацией ООП, так и тем,
что многие программисты не понимали, как правильно применять средства объектно-ориентированного
программирования. Усовершенствования в VB .NET покончили с первой проблемой.
Что касается второй... Что же, именно поэтому эта глава начинается с краткого
курса ООП. Как бы вы к этому не относились, нормальное программирование в VB
.NET возможно лишь при полноценном использовании объектной природы этого языка.
В главах 4-6 ООП рассматривается с практической точки зрения программиста VB
.NET, без углубленного изучения теоретических тонкостей. Особое внимание уделяется
практическим примерам и приемам, используемым при решении реальных задач. Мы
постараемся обойтись без высоких материй, поскольку чрезмерное обилие деталей
только отвлечет читателя от основной темы — если вас интересует теория, вы найдете
ее в десятках книг, посвященных ООП. Тем не менее в ООП используется достаточно
специфическая терминология, поэтому мы начнем с обсуждения важнейших концепций
и терминов (читатели, хорошо разбирающиеся в ООП, могут пропустить вводную часть).
На следующем
этапе рассматривается использование существующих классов и объектов, созданных
на их основе. В частности, мы покажем, как использовать важный класс StringBuilder
и некоторые новые классы коллекций .NET Framework (в том числе хэш-таблицы и
динамические массивы). Вы узнаете о некоторых тонкостях,
связанных с передачей объектов функциям и процедурам. Только после этого мы
перейдем к определению новых классов и построению объектов на их основе (хотя
в этой главе приводятся начальные сведения о наследовании и интерфейсах, подробное
описание этих ключевых концепций ООП откладывается до главы 5).
Несмотря
на внешние различия, с позиций ООП языки С# и VB .NET очень похожи, по-этому
хорошее знание материала глав 4 и 5 упростит переход на С# и Java.
VB .NET значительно
расширяет событийную модель программирования прежних версий VB, в основу которой
были заложены элементы управления. В VB .NET вся программа состоит из самостоятельных
объектов, взаимодействующих друг с другом. Объекты создаются по шаблонам, называемым
классами. Объекты, построенные на базе одного класса:
Если объект
ведет себя по определенным правилам, образующим открытый интерфейс, и
должным образом реагирует на внешние воздействия, пользователю не нужно думать
о внутренней реализации этого объекта.
Программистам
VB хорошо знакома концепция автономных фрагментов программного кода с четко
определенной функциональностью. Конечно, речь идет об элементах управления.
Возможность многократного использования кода, оформленного в виде элементов,
повышает эффективность программирования на VB по сравнению с традиционной (процедурной)
моделью.
Одно из величайших
преимуществ .NET заключается в том, что вы можете программировать классы на
любом языке по своему выбору, и они будут нормально работать в любом другом
языке. Например, написанный на VB .NET элемент можно будет использовать в С#,
и наоборот, а благодаря среде Common Language Runtime выбор языка практически
не отразится на быстродействии.
Классы как пользовательские типы
Класс также
можно рассматривать как «интеллектуальный» пользовательский тип,
обладающий расширенными возможностями — например, перед изменением своих внутренних
данных класс может проверить их новые значения. При обращении к данным класс
может проверить полномочия стороны, от которой поступил вызов. Наконец, представьте
себе пользовательский тип, который возвращает данные в определенном формате
вместо того, чтобы просто выдавать их внутреннее представление.
С этой точки
зрения объект представляет собой переменную пользовательского типа, с которой
ассоциированы функции обращения к данным и их проверки. Главный принцип работы
с данными класса — замена прямого доступа к данным вызовом вспомогательных функций.
На
первый взгляд организация доступа к данным при помощи функций только прибавляет
работы программисту, но это небольшое усложнение с лихвой компенсируется преимуществами
от проверки и контроля доступа к данным.
По мере освоения
ООП перед вами откроются новые возможности, не ограничивающиеся простой проверкой
или возвращением внутренних данных объекта.
Как объекты взаимодействуют друг с другом?
Согласно
одному из ключевых принципов ООП каждый класс (= шаблон для построения объектов)
отвечает за выполнение небольшой группы взаимосвязанных задач. Проектирование
и отладка специализированного класса, предназначенного для создания простых
объектов с небольшим количеством задач, занимает гораздо меньше времени, чем
разработка классов со сложными внутренними структурами данных, многочисленными
методами и свойствами. Если потребуется сделать нечто такое, на что ваш объект
не рассчитан, не стоит вносить изменения в исходный класс и усложнять его —
лучше определите новый класс, оптимизированный для решения этой задачи. Предоставьте
старому объекту доступ к объектам нового типа, и старый объект сможет обратиться
к новому объекту с запросом на выполнение нужной операции.
Пользователи
прежних версий VB хорошо знакомы с подобным взаимодействием между объектами.
В частности, именно это и происходит при вызове методов или задании свойств
элементов. С точки зрения пользователя, запрос к другому объекту реализуется
обращением к свойству или вызовом метода этого объекта. На внутреннем уровне
в обработке запросов участвуют обобщенные версии функций и процедур VB .NET
(см. главу 3). Таким образом, все подробности внутренней реализации остаются
скрытыми от внешнего мира.
На жаргоне
ООП этот принцип формулируется так: объекты взаимодействуют с другими объектами
только посредством обмена сообщениями. Еще раз подчеркнем — объект никогда
не должен напрямую работать с внутренними данными другого объекта. Все взаимодействие
должно происходить на уровне сообщений (задания свойств и вызова методов). Проектируйте
свои объекты по принципу «черного ящика»: объект реагирует на сообщения
из определенного набора, а его фактическая реализация остается неизвестной.
Подведем
итог. Все операции с объектами в программе должны сводиться к изменению их свойств
и вызову методов. Не используйте открытые (глобальные) переменные в классах
или объектах, созданных на их основе.