Классы и объекты

  • Введение в ООП
  • Классы как пользовательские типы
  • Как объекты взаимодействуют друг с другом?
  • Терминология ООП
  • Отношения между классами в программах
  • Абстракция
  • Инкапсуляция
  • Наследование
  • Полиморфизм
  • Переход к использованию объектов
  • Экземпляры
  • Преимущества ООП
  • Создание объектов в VB .NET
  • Параметризованные конструкторы
  • Пример: класс String
  • Пример: класс String Builder
  • Хронометраж — насколько быстрее работает класс StringBuilder?
  • Пространства имен
  • Импортирование
  • Класс Directorylnfo
  • Справочная система и .NET Framework
  • Классы коллекций в .NET Framework
  • ArrayList
  • Хэш-таблицы
  • Объектные переменные
  • Is и Nothing
  • TypeName и TypeOf
  • Проблемы с передачей объектных переменных по значению
  • Определение классов в программе
  • Атрибуты уровня доступа и создание объектов
  • Me
  • Перегрузка членов класса
  • Снова о конструкторах
  • Снова о свойствах
  • Свойства и инкапсуляция
  • Область видимости переменных
  • Вложенные классы
  • Практическое использование вложенных классов на примере связанного списка
  • Общие данные в классах
  • Общие члены классов
  • Жизненный цикл объекта
  • Уничтожение объектов
  • Структурные типы
  • Перечисляемые типы
  • Структуры
  • Определение структур в программе
  • Пространства имен для создаваемых классов
  • Окно классов
  • Отладка объектно-ориентированных программ
  • Итоги
  • Эта глава вместе с главами 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 .NET это происходит при вызове метода или изменении свойства).
  • Если объект ведет себя по определенным правилам, образующим открытый интерфейс, и должным образом реагирует на внешние воздействия, пользователю не нужно думать о внутренней реализации этого объекта.

    Программистам VB хорошо знакома концепция автономных фрагментов программного кода с четко определенной функциональностью. Конечно, речь идет об элементах управления. Возможность многократного использования кода, оформленного в виде элементов, повышает эффективность программирования на VB по сравнению с традиционной (процедурной) моделью.

    Одно из величайших преимуществ .NET заключается в том, что вы можете программировать классы на любом языке по своему выбору, и они будут нормально работать в любом другом языке. Например, написанный на VB .NET элемент можно будет использовать в С#, и наоборот, а благодаря среде Common Language Runtime выбор языка практически не отразится на быстродействии.

     

    Классы как пользовательские типы

    Класс также можно рассматривать как «интеллектуальный» пользовательский тип, обладающий расширенными возможностями — например, перед изменением своих внутренних данных класс может проверить их новые значения. При обращении к данным класс может проверить полномочия стороны, от которой поступил вызов. Наконец, представьте себе пользовательский тип, который возвращает данные в определенном формате вместо того, чтобы просто выдавать их внутреннее представление.

    С этой точки зрения объект представляет собой переменную пользовательского типа, с которой ассоциированы функции обращения к данным и их проверки. Главный принцип работы с данными класса — замена прямого доступа к данным вызовом вспомогательных функций.

    На первый взгляд организация доступа к данным при помощи функций только прибавляет работы программисту, но это небольшое усложнение с лихвой компенсируется преимуществами от проверки и контроля доступа к данным.

    По мере освоения ООП перед вами откроются новые возможности, не ограничивающиеся простой проверкой или возвращением внутренних данных объекта.

     

    Как объекты взаимодействуют друг с другом?

    Согласно одному из ключевых принципов ООП каждый класс (= шаблон для построения объектов) отвечает за выполнение небольшой группы взаимосвязанных задач. Проектирование и отладка специализированного класса, предназначенного для создания простых объектов с небольшим количеством задач, занимает гораздо меньше времени, чем разработка классов со сложными внутренними структурами данных, многочисленными методами и свойствами. Если потребуется сделать нечто такое, на что ваш объект не рассчитан, не стоит вносить изменения в исходный класс и усложнять его — лучше определите новый класс, оптимизированный для решения этой задачи. Предоставьте старому объекту доступ к объектам нового типа, и старый объект сможет обратиться к новому объекту с запросом на выполнение нужной операции.

    Пользователи прежних версий VB хорошо знакомы с подобным взаимодействием между объектами. В частности, именно это и происходит при вызове методов или задании свойств элементов. С точки зрения пользователя, запрос к другому объекту реализуется обращением к свойству или вызовом метода этого объекта. На внутреннем уровне в обработке запросов участвуют обобщенные версии функций и процедур VB .NET (см. главу 3). Таким образом, все подробности внутренней реализации остаются скрытыми от внешнего мира.

    На жаргоне ООП этот принцип формулируется так: объекты взаимодействуют с другими объектами только посредством обмена сообщениями. Еще раз подчеркнем — объект никогда не должен напрямую работать с внутренними данными другого объекта. Все взаимодействие должно происходить на уровне сообщений (задания свойств и вызова методов). Проектируйте свои объекты по принципу «черного ящика»: объект реагирует на сообщения из определенного набора, а его фактическая реализация остается неизвестной.

    Подведем итог. Все операции с объектами в программе должны сводиться к изменению их свойств и вызову методов. Не используйте открытые (глобальные) переменные в классах или объектах, созданных на их основе.