-
Эта глава вместе с главами 5 и 6 занимает центральное место в книге. Причины просты: язык VB.NET стал первой объектно-ориентированной версией VB, и тот, кто недостаточно хорошо разбирается в ООП, не сможет в полной мере использовать новые возможности VB.NET.
-
Класс также можно рассматривать как "интеллектуальный" пользовательский тип, обладающий расширенными возможностями – например, перед изменением своих внутренних данных класс может проверить их новые значения.
-
Отправной точкой во всей терминологии ООП является понятие класса. Классом называется шаблон, по которому создаются объекты. | Каждый объект, созданный на основе класса, называется экземпляром этого класса. Методы, свойства и процедуры событий, определенные внутри класса, называются членами.
-
Абстракцией называется моделирование объектов в программе. Другими словами, речь идет об имитации реально существующих объектов, отражающей особенности их взаимодействия в окружающем мире. Так, первый объектно-ориентированный язык Simula (http://java.sun.com/people/jag/SimulaHistory.html) разрабатывался специально для задач имитации и моделирования.
-
В качестве примера наследования представьте себе классы для отдельных категорий работников (класс Programmer, класс Manager и т. д.). Механизм, используемый для создания таких классов на базе класса Employee, называется наследованием.
-
В традиционной трактовке термин "полиморфизм" (от греческого "много форм") означает, что объекты производных классов выбирают используемую версию метода в зависимости от своего положения в иерархии наследования.
-
С давних времен в программировании использовалась структурная, процедурно-ориентированная модель. Сначала программист разбирался, что должна делать программа, а затем выбирал одно из двух: | Задача разбивалась на подзадачи; те, в свою очередь, делились на подзадачи следующего уровня и т. д.
-
Итак, вы решили, какие классы должны входить в ваш проект. На следующем этапе построения объектной модели рассматриваются конкретные экземпляры этих классов. Попробуйте ответить на три вопроса: | Каким состоянием должен обладать объект? | Какими отличительными особенностями должен обладать объект?
-
В VB.NET, как и в прежних версиях VB, объекты создаются ключевым словом New (исключение составляют строки и массивы – для создания этих объектов предусмотрена сокращенная запись). | Рассмотрим практический пример – в .NET Framework входит полезный класс Random для работы со случайными числами.
-
На первый взгляд конструктор New работает так же, как в предыдущих версиях VB. В действительности изменилось очень многое, и самое принципиальное изменение заключается в том, что при вызове New теперь могут передаваться параметры.
-
Другим хорошим примером класса с несколькими конструкторами является класс String. Хотя для конструирования строк предусмотрена сокращенная запись (последовательность символов, заключенная в кавычки), в более сложных случаях лучше перейти на использование конструкторов.
-
Хотя Microsoft не разрешает публиковать точные результаты хронометража для бета-версий (и это вполне разумно, поскольку в них содержится большой объем отладочного кода), отношение результатов, полученных в ходе измерений, почти всегда остается более или менее постоянным.
-
При использовании кода, написанного другими программистами, всегда возникает потенциальная опасность конфликтов имен. Но даже если забыть об этих конфликтах, все равно необходимо каким-то образом сгруппировать тысячи методов в соответствии с их функциональным назначением.
-
В библиотеку .NET Framework входят сотни пространств имен, каждое из которых содержит множество полезных классов. По масштабам и возможностям .NET Framework сравнима с полным интерфейсом Win32 API. Библиотека настолько огромна, что описать ее в одной книге попросту невозможно.
-
Чтобы пробудить в вас интерес к .NET Framework, мы кратко рассмотрим некоторые классы коллекций. В этих классах реализуются стандартные структуры данных, часто используемые в нетривиальных программах.
-
Простые и динамические массивы удобны прежде всего тем, что вы можете напрямую обратиться к любому элементу по индексу. Конечно, для этого необходимо знать индекс. В следующей структуре данных – хэш-таблице – произвольный доступ к данным осуществляется по ключу.
-
Рассмотрим следующий фрагмент: | Dim thing As New Object | Dim aRandomlnstance As New Random | В нем объявляются и создаются две переменные: thing и aRandomlnstance. Первая переменная содержит ссылку на тип Object, а вторая – ссылку на экземпляр класса Random.
-
Оператор Is проверяет, ссылаются ли две объектные переменные на одну область памяти.
-
Большинство языков программирования требует четкого понимания, чем передача параметров по ссылке отличается от передачи по значению. Не забывайте, что в VB.NET параметры по умолчанию передаются по значению (ByVal).
-
От использования готовых классов .NET Framework мы переходим к определению собственных классов в программе. Код класса можно разместить в отдельном файле при помощи команды Project › Add Class, как в VB6, или же просто ввести его в нужном модуле – например, в стартовом модуле, содержащем точку входа в консольное приложение.
-
Атрибуты уровня доступа, установленные для класса, управляют возможностью создания объектов соответствующего типа. Грубо говоря, они являются отдаленным аналогом свойства Instancing в VB6, хотя для некоторых значений Instancing приходится дополнительно учитывать уровень доступа конструктора.
-
Метод RaiseSalary класса Employee можно сделать и поинтереснее. Предположим, повышения зарплаты до 10% происходят автоматически, но для больших сумм требуется специальный пароль. В прежних версиях VB такие задачи решались при помощи необязательных параметров.
-
Если в вашем классе не определен конструктор, VB.NET автоматически генерирует для него конструктор, вызываемый без аргументов. Работа этого конструктора сводится к инициализации всех полей экземпляра значениями по умолчанию.
-
Принципиальное различие в работе свойств VB6 и VB.NET заключается в том, что секции Get и Set теперь должны обладать одинаковым уровнем доступа. Определять свойства с секциями Public Get и Private Set в VB.NET не разрешается. | Примечание | Это ограничение легко обходится.
-
Переменные класса (в том числе и закрытые поля), объявленные за пределами его методов или свойств, доступны для всех членов класса. Переменные, объявленные в методе или свойстве, являются локальными по отношению к этому методу или свойству.
-
В программах VB.NET нередко встречаются ситуации, когда у вас имеются два класса: "внешний" и "внутренний", фактически принадлежащий первому. Вложенные (nested) классы обычно выполняют вспомогательные функции, и их код имеет смысл лишь в контексте внешнего класса.
-
Вернемся к классу Еmploуее. Допустим, каждому работнику необходимо присвоить уникальный номер. В старых версиях VB задача решалась при помощи глобальных переменных, что приводило к нарушению инкапсуляции и создавало потенциальную угрозу случайного изменения номеров внешним кодом.
-
Итак, при создании экземпляра класса оператором New вызывается соответствующий метод-конструктор New из определения класса (также может быть вызван общий конструктор, если он есть). Версия конструктора выбирается в соответствии с типом переданных параметров.
-
Традиционно в объектно-ориентированных языках возникало немало проблем с простейшими типами данных – такими, как обычные целые числа. Дело в том, что в объектно-ориентированном языке все данные должны быть объектами.
-
Перечисляемые типы обычно используются для определения набора именованных целочисленных констант. При определении перечисляемого типа используется пара ключевых слов Enum-End Enum вместе с модификатором доступа.
-
Некоторые полагают, что структуры VB.NET аналогичны пользовательским типам прежних версий VB или многих других языков программирования. Конечно, структуры VB.NET могут использоваться как пользовательские типы, но этим область их возможного применения не исчерпана.
-
Классы, перечисляемые типы, структуры или модули включаются в пространства имен. Конечно, создать экземпляр модуля невозможно – только экземпляры классов, определяемых в модуле. В диалоговом окне Project Properties, показанном на рис.
-
Теперь, когда вы знаете, как определять собственные классы, вам будет проще работать с окном классов, в котором члены классов вашего решения отображаются в виде удобного иерархического дерева. Окно классов помогает ориентироваться в коде вашего решения: при двойном щелчке в одной из строк окна классов в окне программы автоматически открывается код соответствующего члена.
-
Отладка объектно-ориентированных программ всегда начинается с анализа объектных переменных и проверки того, соответствует ли их состояние предполагаемому. Именно по этой причине в VS IDE предусмотрены средства для получения информации о закрытых полях ваших классов – окна просмотра (Watch) и локальных переменных (Locals). Применение этих средств отладки будет рассмотрено на простом примере.