Разделы

  Java, JavaScript
  Документация Perl
  Новости
  Документация ASP
  Flash
  Интернет протоколы
  Apache
  Уроки программирования
  Язык программирования C

Объектно-ориентированный подход к созданию программных средств

Уроки программирования
3.8 / 5 (62 оценок)


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

Объектные переменные конкретного типа могут содержать ссылки только на объект указанного типа, например типа Клиент. При попытке связать эту переменную с объектом другого типа возникает ошибка. При использовании конкретных объектных переменных компилятор Visual Basic применяет так называемое раннее связывание, т.е. описывает соответствующий объект во время компиляции программы, а не во время ее работы. Раннее связывание эффективным способом работы с объектами, благодаря чему обеспечивается быстрые работа программы. Другое преимущество использования объектных переменных конкретного типа - предоставление интеллектуальной поддержки при подготовке текста программы. Она заключается в том, что если при вводе текста программы ставится точка и Visual Basic обнаруживает, что перед точкой стоит имя объекта известного ему типа, то он выводит на экран информацию о доступных свойства и методы этого объекта.

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

Самая обычная переменная имеет тип Variant. Такая переменная может содержать числовые и строковые данные и, кроме того, ссылка на объекты любого типа. Но для общих переменных, которые будут содержать только ссылки на объекты, следует использовать тип данных Object. Например:
Dim ПопереднийЗамовник As Object
Set ПоточнийЗамовник = New Клиент

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

Методы класса. Любая процедура Public Sub или Public Function, находящегося в модуле класса, является его методом. При создании экземпляра класса такие процедуры будут доступны как методы соответствующего объекта. Если же процедура в модуле класса объявляется локальной (Private), то она может использоваться только в этом модуле, т.е. она не может использоваться как метод класса.

Для создания процедур Sub и Function можно использовать пустые заготовки, которые при работе в IDE вставляются в модуль командой Tools / Add Procedure, а в окне проекта документа MS Office - командой Insert / Procedure. После этого они заполняются необходимым программным кодом, который реализует соответствующую функциональную возможность объекта.

Создание и использование объектов в Visual Basic
Каждый модуль класса выполняет роль проекта (шаблона) для объектов определенного типа. Иными словами, каждый модуль класса определяет один тип объектов, нужное количество которых создается во время выполнения программы через создание экземпляров класса.
В теле каждого модуля класса определяются некоторые или все его характеристики, к которым относятся:
• свойства (Propertes);
• методы (Methods);
• события (Events).

Свойства класса. Одна (обязательно) свойство класса определяется при создании модуля класса. Это имя модуля класса, а значит, и имя класса. Для создания других свойств класса, значения которых будут характеризовать каждый объект этого типа - экземпляры класса, применяются два способа. Первый из них заключается в создании глобальных (public) переменных в секции общих объявлений. Второй, более сложный и действенный, - это создание закрытых свойств, доступ к которым приобретается с помощью процедур свойств (property procedure), которые автоматически активизируются при каждой смене значений свойств или обращении к свойствам.

Создание свойств класса с помощью глобальных (общедоступных) переменных приводит к появлению открытых свойств. При работе с объектом до сих свойств есть прямой доступ как при чтении, так и при записи значения свойства. Но такая свобода обращения с свойством часто недопустима. Вот полный перечень возможных стратегий при работе со свойствами:
• чтение и запись (Read-Write);
• чтение, запись при первом обращении (Read, Write-once);
• только чтение (Read-only);
• только записи (Write-only);
• ни чтения, ни записи (Not Read - Not Write).
Открытые свойства позволяют реализовать лишь первую стратегию. Для реализации других требуются дополнительные возможности. Такие возможности дает использование специальных процедур-свойств (см. табл. 1.2):
• Property Let позволяет установить новое значение свойства, выполняя операцию Write (присвоение).
• Property Set дополняет предыдущую процедуру, позволяя присвоить объектной переменной (свойства) ссылка на определенный объект.
• Property Get позволяет прочитать значение свойства, выполняя операцию Read.
При реализации первой стратегии (Read - Write) каждая открытая свойство должно иметь пару процедур-свойств Get и Let (Set), которым дается одинаковое имя (это имя является и именем свойства).

Для создания процедур-свойств можно использовать пустые заготовки, автоматически. При работе в IDE они вставляются в модуль командой Tools / Add Procedure, а в окне проекта документа MS Office - командой Insert / Procedure. После этого они заполняются нужным кодом.

В следующем фрагменте кода модуля класса Клиент показано процедуры-свойства, при выполнении которых записывается (заглавные) и возвращается текстовое значение свойства Фамилия:
Private msПризв As String
Public Property Let Фамилия (ПризвищеКл As String)
msПризв = Ucase (ПризвищеКл)
End Property
Public Property Get Фамилия ()
Фамилия = msПризв
End Property

При реализации стратегии Read, Write-once необходимо, чтобы значение свойства было записано только при первом обращении, а после этого - не менялось. В этом случае процедура-свойство Let (Set) должна выполнять проверку, не делалось присвоении свойства какого значения. Например:
Public Property Let Фамилия (Значение As String)
If msПризв = "" Then msПризв = Ucase (Значение)
End Property

Если свойство является переменной типа Variant, то проверить, было предоставлено (присвоено) какое значение этой переменной, можно с помощью функции IsEmpty:
If IsEmpty (<имя переменной>) Then ...,
которая возвращает значение True или False.

Для проверки объектной переменной можно применить оператор Is и ключевое слово Nothing:
If <имя объектной переменной> Is Nothing Then ...
Поскольку объектные переменные до первого присвоения ссылка на объект имеют значение Nothing, то в этом случае результатом применения оператора Is будет значение True, иначе - False.

При реализации стратегии Read-only или Write-only используется только одна из трех процедур: Get, Let и Set. Для Read-only - это Get, а для Write-only - это Let или Set.
Последнее стратегия полностью закрывает доступ к свойству и процедуры-свойства вообще не записываются.

Стоит отметить, что в случае, когда свойство имеет тип Variant, ее значением могут быть как обычные данные (числа, текст), так и объекты. В этом случае для присвоения ей значения это свойство должно иметь как процедуру Let, так и процедуру Set. Эти процедуры должны иметь одинаковое количество параметров и у них должно быть по крайней мере один параметр, который представляет собой значение, которое присваивается свойства. Этот параметр должен всегда быть последним в списке параметров.

Вторая особенность, на которую надо обратить внимание, это то, что два способа создания свойства (с помощью переменной public и с помощью процедуры property) можно применять только при реализации первой стратегии. При этом возникает вопрос о преимуществах и недостатках каждого из этих способов. Первый способ (глобальные переменные) более быстродействующий (если его можно использовать), однако второй - универсальный, поскольку позволяет при чтении или записи значения свойства выполнять дополнительную обработку данных. Установка и получение значения свойства выполняется независимо от способа создания их. В следующем примере используются два объекта - экземпляра класса Клиент и устанавливается (записывается) и возвращается (читается) их свойство Фамилия:
Dim ПопереднийЗамовник As New Клиент
Dim ПоточнийЗамовник As New Клиент
'Запись (присвоение) значений свойств:
ПопереднийЗамовник.Фамилия = "Сумина"
ПоточнийЗамовник.Фамилия = "Мищук"
'Чтение значений свойств:
MsgBox ПопереднийЗамовник.Фамилия
MsgBox ПоточнийЗамовник.Фамилия
'Чтение и присвоение значения свойства:
ПопереднийЗамовник.Фамилия =
ПоточнийЗамовник.Фамилия
'Чтение новое значение свойства:

MsgBox ПопереднийЗамовник.Фамилия
Этот пример показывает два отличия модуля класса от стандартного модуля:
• модуль класса используется как шаблон для создания объекта (экземпляра класса);
• можно создавать несколько экземпляров одного класса.

Для того чтобы можно было создать объект, его имя (объектная переменная) должно быть задекларировано (объявлен). Объектная переменная нужна для того, чтобы можно было обращаться к объекту, который размещается в некотором месте оперативной памяти. Но для этого эта переменная, имеет фиксированную длину в 4 байта, должен содержать адрес размещения объекта в памяти. В отличие от обычных переменных при откровении объектной переменной память самого объекта может и не выделяться. В таком случае объектная переменная не может ссылаться на конкретный объект, но все равно она будет иметь конкретное значение, а именно - Nothing (ничего).

Существует два способа объявления объектных переменных. Первый был использован в предыдущем примере. Он заключается в декларировании с применением ключевого слова New:
Dim <имя объектной переменной> As New <имя класса>

Этот способ объявления объектной переменной гарантирует, что если при обращении к объекту будет обнаружено, что он не существует, то он автоматически будет создан (в предыдущем примере такими первыми обращениями к объектам были операторы присвоения значения свойства Фамилия этих объектов). Следует иметь в виду, что каждый раз, когда в программе делается обращение к такой переменной, делается проверка, существует ли соответствующий объект. А значит, при каждом обращении к такому объекту тратится дополнительное время на выполнение такой проверки.

Альтернативный способ заключается в том, что сначала объявляется объектная переменная, принадлежащая к нужному классу, а затем используется оператор Set для связывания этой переменной с объектом. Команда декларирования объектной переменной обычный синтаксис:
Dim <имя объектной переменной> As <имя класса>

При выполнении команды создается объектная переменная соответствующего типа и ей присваивается значение Nothing. Для назначения объектной переменной ссылку на конкретный объект необходимо выполнить оператор Set в одной из следующих форм:
Set <имя объектной переменной> = New <имя класса>
Set <имя объектной переменной> = <идентификатор объекта>

При наличии в операторе Set ключевого слова New выполнения оператора ведет к созданию нового объекта указанного типа и присвоение объектной переменной ссылку на этот объект.
Вторая форма оператора Set применяется для присвоения ссылки на уже существующий объект. Естественно, что такая форма оператора Set можно применять только тогда, когда объект, идентификатор которого используется в команде, уже существует как объект соответствующего класса. Например:
Dim ПопереднийЗамовник As Клиент
Dim ПоточнийЗамовник As Клиент
Set ПоточнийЗамовник = New Клиент
Set ПопереднийЗамовник = ПоточнийЗамовник
ПоточнийЗамовник.Фамилия = "Сумина"
MsgBox ПопереднийЗамовник.Фамилия 'Выводит значение
'Сумина
Set ПоточнийЗамовник = Nothing
MsgBox ПопереднийЗамовник.Фамилия 'Выводит значение
'Сумина

Стоит обратить внимание на то, что в этом примере после выполнения команды Set ПопереднийЗамовник = ПоточнийЗамовник две переменные ссылаются на один и тот же объект и поэтому к этому объекту можно обращаться, используя имя любой из этих переменных - как ПопереднийЗамовник, так и ПоточнийЗамовник.

После выполнения команды Set ПоточнийЗамовник = Nothing объектной переменной ПоточнийЗамовник присваивается значение Nothing и она перестает ссылаться на любой объект, но объект, на который она перед этим ссылалась, можно продолжать обращаться по имени ПопереднийЗамовник. Если бы переменная ПоточнийЗамовник была единственной переменной, связанной с объектом, на который она ссылалась, то присвоение ей значение Nothing привело бы к выгрузке этого объекта из памяти и появления стандартной события Class_Terminate.

Следует понять разницу между объектными переменными общего и конкретного типа. Выбор того или иного способа объявления переменной зависит от того, как планируется использовать переменную и насколько существенно, чтобы операции с ней выполнялись наиболее эффективно.
Объектные переменные конкретного типа могут содержать ссылки только на объект указанного типа, например типа Клиент. При попытке связать эту переменную с объектом другого типа возникает ошибка. При использовании конкретных объектных переменных компилятор Visual Basic применяет так называемое раннее связывание, т.е. описывает соответствующий объект во время компиляции программы, а не во время ее работы. Раннее связывание эффективным способом работы с объектами, благодаря чему обеспечивается быстрые работа программы. Другое преимущество использования объектных переменных конкретного типа - предоставление интеллектуальной поддержки при подготовке текста программы. Она заключается в том, что если при вводе текста программы ставится точка и Visual Basic обнаруживает, что перед точкой стоит имя объекта известного ему типа, то он выводит на экран информацию о доступных свойства и методы этого объекта.

Особенностью общей объектной переменной является то, что она может содержать ссылку на любой тип объекта, т.е. тип соответствующего объекта можно определить только во время выполнения программы (так называемое позднее, или динамическое связывание). Поскольку для выполнения программы тип объекта неизвестен, то интеллектуальная поддержка при работе с таким объектом отсутствует.
Самая обычная переменная имеет тип Variant. Такая переменная может содержать числовые и строковые данные и, кроме того, ссылка на объекты любого типа. Но для общих переменных, которые будут содержать только ссылки на объекты, следует использовать тип данных Object.
Например:
Dim ПопереднийЗамовник As Object
Set ПоточнийЗамовник = New Клиент

Использование динамического связывания - менее эффективный способ работы с объектами, который может ухудшить производительность программы, но он - гибкий и позволяет использовать один и тот же код для работы с различными типами объектов.
Методы класса. Любая процедура Public Sub или Public Function, находящегося в модуле класса, является его методом. При создании экземпляра класса такие процедуры будут доступны как методы соответствующего объекта. Если же процедура в модуле класса объявляется локальной (Private), то она может использоваться только в этом модуле, т.е. она не может использоваться как метод класса.

Для создания процедур Sub и Function можно использовать пустые заготовки, которые при работе в IDE вставляются в модуль командой Tools / Add Procedure, а в окне проекта документа MS Office - командой Insert / Procedure. После этого они заполняются необходимым программным кодом, который реализует соответствующую функциональную возможность объекта.

Реализация наследования и полиморфизма. Объектно-ориентированное программирование позволяет не только определить класс, которому задает состояние и поведение его экземпляров, но и организовать семейство классов с помощью отношения между ними - так называемого отношение наследования. Суть этого понятия, как и понятие полиморфизма, уже рассматривалась. Что же дает реализация их на языке программирования?

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

• Совместимость ссылок. Это означает, что объектной переменной базового класса может быть присвоено ссылка на объект порожденного класса. В частности, объект может быть объявлен как экземпляр базового класса, а при создании объекта в операторе New может быть указано порожденный класс, что и позволит создать объект любого порожденного класса.

• Совместимость между формальным и фактическим параметрам процедуры. Формальный параметр может иметь тип базового класса, а при вызове процедуры ей может быть передан фактический параметр любого порожденного класса.
• Равенство прав по вызову. Это означает, что объекты-потомки могут вызывать методы объектов-родителей, а объекты-родители могут вызывать методы объектов-потомков.

Прежде всего следует отметить, что полиморфизм семейства классов в Visual Basic 6.0 реализовано полностью, а наследование - только частично. Последнее не означает, что в Visual Basic 6.0 отсутствует возможность строить систему как семейство классов.

Строить новый класс на основе ранее созданных можно не только посредством подражания, но и с помощью встраивания, вкладывая в модуль нового класса экземпляры ранее созданных классов с ключевым словом Public. Эти вложенные объекты определяют свойства нового класса и называются свойствами-участниками. Помимо свойств-участников новый класс может иметь и свои дополнительные свойства, а также свои методы и события. Если у рожденных классах не переопределяются методы родительских классов, то относительно свойств и поведения классов эти альтернативные способы создания новых классов - подражание и встраивания - эквивалентны. Разница будет лишь в структуре этих семейств классов. Но для того, кто будет их использовать, разница не существенна. Она отразится только на синтаксисе обращения к объектам.

Если в порожденном классе нужно осуществить переопределения методов родительских классов, то в общем случае, применяя встраивания, такой класс создать невозможно. Тогда следует применить наследования интерфейса (под интерфейсом класса понимается совокупность всех его открытых свойств и методов). Для того чтобы объявить, что класс наследует интерфейс другого класса, достаточно в секцию общих объявлений модуля класса добавить оператор
Implements <имя родительского класса>

Как только в модуле класса-потомка будет записан этот оператор на экране его кода появится список открытых (public) методов родительского класса и процедур-свойства Get и Let для каждой свойства. Это позволит автоматически вставить заготовки процедур-методов и процедур-свойств в модуль класса потомка. При этом следует обратить внимание на следующие особенности наследования интерфейсов:

• Наследование может быть множественным, т.е. в модуле класса-потомка может быть несколько операторов Implements для разных родительских классов.
• Наследование подлежат все открытые свойства и методы каждого из непосредственных предков.
• Имена унаследованные процедур содержат название родительского класса. Это означает, что они не должны входить в интерфейс порожденного класса и передаваться его потомкам.

• Заготовки открытых процедур родительских классов вставляются с ключевым словом Private. Это означает, что они не являются открытыми процедурами порожденного класса, а значит, не входят в его интерфейса и не передаются его потомкам. Конечно, можно изменить Private на Public и тогда унаследованные процедуры войдут в интерфейс порожденного класса. Но после этого они смогут наследоваться его потомками, не допускается и приведет к ошибке.

Следует понять, что подражание интерфейсов не означает подражание реализации методов. Кроме того, поскольку они не входят в интерфейс класса-потомка, то они не могут быть вызваны объектами данного класса. Зато подражания интерфейсов позволяет экземплярам родительского класса ссылаться на объект-потомок:
Set <имя объекта-предка> = <имя объекта-потомка>

и, как следствие, обеспечивает им возможность вызывать те методы объекта-потомка, которые были этим объектом унаследованные от родительского класса.

Чтобы реализовать в классе, что подражает интерфейсы, наследование методов, можно использовать технологию встраивания в этот класс экземпляров родительских классов, объявляя их с ключевым словом Private. Тогда можно в методах потомка вызвать соответствующие методы родительских классов.

Коллекции. В Visual Basic есть класс Collection, позволяющий объединять отдельные объекты в упорядоченную совокупность связанных элементов и создавать так называемые коллекции или семейства объектов. Все элементы коллекции индексированные. Кроме того, они могут иметь ключ, связанный с элементом. В отличие от массивов в коллекцию могут входить элементы разного типа, т.е. экземпляры различных классов.

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

• Свойство Count возвращает количество элементов в семействе. Она доступна только для чтения и имеет тип Long.
• Метод Add (item, key, before, after) добавляет элемент в коллекцию. Первый параметр является обязательным, поскольку он определяет добавлений элемент. Второй - необязательный и задается, когда элементу ставится в соответствие уникальный в пределах семейства ключ типа string. Третий необязательный параметр задается числовым или символьным выражением и указывает индекс или ключ элемента, перед которым надо вставить добавлений элемент. Четвертый параметр может использоваться, если отсутствует третий. Он указывает элемент, после которого вставляется добавлений. Если отсутствуют оба последних параметры, то элемент добавляется в конец семейства.

• Метод Remove (key) удаляет элемент коллекции с заданным ключом (можно указать индекс элемента). Удаление выполняется перенумерация элементов и уменьшается значение свойства Count.
• Метод Remove (key) возвращает значение элемента коллекции с заданным ключом или индексом.



Другие материалы по теме:

- Средства структурного анализа и проектирования систем
- Технологии Internet
- Разработка программного продукта. Этапы проектирования и построение модели
- Использование языков и сред программирования как средств обучения
- Среда программирования. Интегрированные среды программирования


📌 smti.ru © 2026 SMTI.RU: инструменты, знания и сообщество для создания веб-проектов | Обратная связь