
- •Тема 5.3. Средства объектно-ориентированного программирования в vb
- •5.3.1. Две роли классов в ооп и типы данных в vb
- •5.3.2. Средства создания классов в vb
- •5.3.2.1. Средства создания пользовательских классов
- •5.3.2.2. Пошаговое руководство для создания приложения с классами
- •Определение класса
- •Создание кнопки для тестирования класса
- •Запуск приложения
- •5.3.3. Взаимодействие, взаимное различие и сходство форм, модулей и классов
- •5.3.4. Создание объектной модели и приложений с использованием классов
- •5.3.5. Иерархия классов и наследование
- •Наследование и тождественность
- •Базовые классы и повторное использование кода
- •Взаимозаменяемые производные классы
- •Неполные иерархии классов
- •Глобальные изменения производных классов через базовый класс
- •Изменение структуры базовых классов после развертывания
- •Проблема уязвимости базовых классов
- •Сведение к минимуму проблем уязвимости базовых классов
- •5.3.6. Задачи для самостоятельного решения по теме «Средства объектно-ориентированного программирования в Visual Basic»
- •5.3.7. Тестовые задания по теме «Средства объектно-ориентированного программирования в vb»
- •Тема 5.3. Средства объектно-ориентированного программирования в Visual Basic Страница 95
Тема 5.3. Средства объектно-ориентированного программирования в vb
5.3.1. Две роли классов в ООП и типы данных в VB
5.3.2. Средства создания классов в VB
5.3.3. Взаимодействие, взаимное различие и сходство форм, модулей и классов
5.3.4. Создание объектной модели и приложений с использованием классов
5.3.5. Иерархия классов и наследование
5.3.6. Задачи для самостоятельного решения по теме «Средства объектно-ориентированного
программирования в VB»
5.3.7. Тестовые задания по теме «Средства объектно-ориентированного программирования в
VB»
5.3.1. Две роли классов в ооп и типы данных в vb
Язык программирования Visual Basic является объектно-ориентированным языком. Это означает, что все функциональные части приложений рассматриваются как объекты, содержащие в себе некоторые свойства, способные выполнять определенные методы и генерировать события. На первый взгляд классы ООП и связанные с ними методы и свойства имеют много общего с процедурным подходом и модульным строением программ. Ключевое различие заключается в следующем:
Класс представляет собой шаблон для создания объектов, состояние которых изменяется со временем.
С классами студенты сталкивались практически во всех предыдущих темах. Это были классы, предоставленные пользователю VS .Net в виде библиотек классов .Net Framework.
Например, класс математических функций – System.Math, класс – System.Array, System.IO, форма и элементы управления – System.Form и другие.
Объектно-ориентированное программирование и проектирование построено на классах. Любую программную систему, построенную в объектном стиле, можно рассматривать как совокупность классов, объединенных в проекты, пространства имен, решения, как это делается при программировании в Visual Studio .Net.
Очень важно обратить внимание на то, что у класса две различные роли: модуля и типа данных.
Во-первых, класс – это модуль, архитектурная единица построения программной системы. Модульность построения – основное свойство программных систем. В ООП программная система, строящаяся по модульному принципу, состоит из классов, являющихся основным видом модуля. Модуль может не представлять собой содержательную единицу, его размер и содержание определяется архитектурными соображениями, а не семантическими. Ничто не мешает построить монолитную систему, состоящую из одного модуля, – она может решать ту же задачу, что и система, состоящая из многих модулей.
Вторая роль класса не менее важна. Класс – это тип данных, задающий реализацию некоторой абстракции данных, характерной для задачи, в интересах которой создается программная система. С этих позиций классы, это не просто кирпичики, из которых строится система. Каждый кирпичик теперь имеет важную содержательную начинку. Представьте себе современный дом, построенный из кирпичей, и дом будущего, где каждый кирпич выполняет определенную функцию, один следит за температурой, другой – за составом воздуха в доме. Объектно-ориентированная программная система напоминает дом будущего.
Состав класса, его размер определяется не архитектурными соображениями, а той абстракцией данных, которую должен реализовать класс. Если создается класс Account, реализующий такую абстракцию как банковский счет, то в этот класс нельзя добавить поля из класса Car, задающего автомобиль.
Объектно-ориентированная разработка программной системы основана на стиле, называемом проектированием от данных. Проектирование системы сводится к поиску подходящих для данной задачи абстракций данных. Каждая из них реализуется в виде класса, которые и становятся модулями – архитектурными единицами построения нашей системы. В основе класса лежит абстрактный тип данных.
В хорошо спроектированной объектно-ориентированной системе каждый класс играет обе роли, так что каждый модуль нашей системы имеет вполне определенную смысловую нагрузку. Типичная ошибка – рассматривать класс, только как архитектурную единицу, объединяя под обложкой класса разнородные поля и функции, после чего становится неясным, какой же тип данных задает этот класс. Класс можно рассматривать как «интеллектуальный» пользовательский тип данных, обладающий расширенными возможностями, например, перед изменением своих внутренних данных класс может проверить полномочия стороны, от которой поступил вызов. С этой точки зрения объект представляет собой переменную пользовательского типа, с которой ассоциированы функции обращения к данным и их проверка. Главный принцип работы с данными класса – замена прямого доступа к данным вызовом вспомогательных функций.
Напомним, что типы данных могут быть двух видов. Тип данных является типом значений, если он содержит данные в пределах своей собственной области памяти и ссылочным типом, если он содержит указатель на область памяти, содержащую данные.
К типам значения относятся:
все числовые типы данных;
типы Boolean, Char и Date;
все структуры, даже если их члены являются ссылочными типами;
перечисления, поскольку их базовый тип всегда является SByte, Short, Integer Long, Byte, UShort, UInteger или ULong.
К ссылочным типам относятся:
тип String;
все массивы, даже если их члены являются типами значений;
типы классов, например Form;
делегаты.
Следующие элементы программирования не квалифицируются как типы, так как нельзя указывать ни один из них в качестве типа данных для объявленного элемента:
пространства имен;
модули;
события;
свойства и процедуры;
переменные, константы и поля.
Переменной типа данных Object можно присвоить либо тип значения, либо ссылочный тип. Переменная Object всегда содержит указатель на данные, но никогда не содержит самих данных. Однако если присвоить тип значений переменной Object, то она ведет себя так, как если бы она содержала свои собственные данные.
Переменная типа данных Object содержит 32-разрядные (4-байтные) адреса, которые ссылаются на объекты. Переменной типа Object можно назначить любой ссылочный тип (строка, массив, класс или интерфейс). Переменная типа Object может также ссылаться на данные любого типа значения (числовые, Boolean, Char, Date, структуры или перечисления).
Тип данных Object может указывать на данные любого типа данных, включая любой экземпляр объекта, который распознает приложение.
Значением Object по умолчанию является Nothing (пустая ссылка).
Переменной Object можно назначить переменную, константу или выражение любого типа данных. Чтобы определить тип данных, на который в данных момент ссылается переменная Object, можно использовать метод GetTypeCode( ) класса System..::.Type, как показано в приведенном ниже примере:
-
Dim myObject As Object
Dim datTyp As Integer
datTyp = Type.GetTypeCode(myObject.GetType())
В данном примере тип данных Object является ссылочным типом. Однако VB обрабатывает переменную Object в качестве типа значения, если она ссылается на данные типа значения.
Все типы данных и все ссылочные типы расширяются до типа данных Object. Это означает, что можно преобразовать любой тип к типу Object без ошибки.
Преобразование переменной типа Object в другой тип данных реализуется с помощью ключевого слова преобразования, например функция CType( ).
В следующем примере преобразуется переменная anObject в Integer и String тип:
-
Public Sub objectConversion(ByVal anObject As Object)
Dim anInteger As Integer
Dim aString As String
anInteger = CType(anObject, Integer)
aString = CType(anObject, String)
End Sub
Если известно, что содержимое переменной типа Object имеет определенный тип данных, желательно преобразовать переменную в этот тип данных. Если продолжать использовать переменную Object, то это вызовет, либо упаковку и распаковку (для типа значения), либо позднюю привязку (для ссылочного типа). Эти операции требуют большего времени для выполнения и снижают производительность. Такой подход также позволяет использовать в коде только самые последние назначенные ему методы и свойства класса. Это может вызвать ошибки во время выполнения, если код пытается получить доступ к членам другого класса. Если определенный класс известен во время компиляции, следует объявить объектную переменную в этом классе. Такой подход называется ранним связыванием. Раннее связывание позволяет повысить производительность и гарантирует доступ ко всем методам и свойствам определенного класса. Объявление объектной переменной в определенном классе объекта дает следующие преимущества:
Автоматическая проверка типа
Гарантированный доступ ко всем членам определенного класса
Поддержка Microsoft IntelliSense в редакторе кода
Улучшение читаемости кода
Снижение числа ошибок в коде
Обнаружение ошибок во время компиляции, а не во время выполнения
Увеличение скорости выполнения кода