Объектно-ориентированное программирование в среде Visual Basic 2010 Express

Материал из УссуриВики
Перейти к: навигация, поиск
Автор Елена Таранцица

Существующие парадигмы программирования

Языки высокого уровня (Algol 68, Fortran, PL/1 и т.д.) облегчили трудоемкую работу по созданию машинного кода, который стал делать компилятор. Программы стали короче и понятнее.

Потом задачи усложнились, и программы снова стали слишком громоздкими. Программы стали разбивать на процедуры или функции, которые решают свои задачи. Написать, откомпилировать и отладить маленькую функцию можно легко и быстро, а потом собрать все функции воедино. Такое программирование стало процедурным программированием и стало парадигмой.

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

Появились новые языки.

Удачная структура данных может облегчить их обработку. Некоторые удобно представить в виде массива, а другие в виде стэка или дерева. Рост сложности и размеров программ потребовал развития структурирования данных и появления новых типов данных, которые могут определяться программистом.

Идея объединения данных и всех процедур их обработки в единый модуль – парадигма модульного программирования.

Сначала такой модуль был более или менее случайным набором данных и подпрограмм. В такие модули собирали подпрограммы, которые, как казалось, скорее всего будут изменяться совместно. Программы составлялись из отдельных модулей. Эффективность таких программ тем выше, чем меньше модули зависят друг от друга. Необходимо четко отделить процедуры, которые будут вызываться другими модулями – открытые процедуры. Отделять их будем от вспомогательных, которые обрабатывают данные, заключенные в модуль. Данные, занесенные в модуль также делятся на открытые и закрытые. Удобно разбить программу на модули. Таким образом, чтобы она превратилась в совокупность взаимодействующих объектов.

Так возникло ООП.

Это современная парадигма программирования.

Все программы состоят из двух частей (описание и сама программа). Любая программа может быть концептуально организована либо вокруг её кода “кодовое воздействие на данные”, либо вокруг данных “управляемый данными доступ к коду”.

При первом процедурном подходе программу определяет последовательность операторов её кода. Второй подход организует программу вокруг данных, т.е. вокруг объектов и набора хорошо организованных интерфейсов.

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

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

Каждый объект будет экземпляром какого-либо определенного класса.

Классы реализованы (организованы) иерархически.

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

Недостатки – снижение быстродействия из-за более сложной организации программы.


ООП в Microsoft Visual Basic

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

Класс – это пользовательский тип, обладающий расширенными возможностями. Объект – это переменная пользовательского типа.

Классы содержат в себе процедуры и функции, которые применимы к переменным данного класса. Эти процедуры и функции называются методами.

Четыре концепции ООП

New-Mind-Map 3m96t.jpg

Инкапсуляция – ограничение прав доступа.

Объекты в задаче сохраняют конкретные данные, тип которых определяется полями класса. Каждый объект в задаче играет роль, определяет его “поведение”. То, что может делать каждый объект (кроме сохранения значений своих полей) задается элементами функции.

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

Так элементы private оказываются автоматически доступными только для методов самого класса, но сокрытыми для другой части программы.

Элементы public определяют интерфейс класса с другими частями программы и другими классами.

Наследование. Объекты могут получать свойства и методы других объектов (предков).

Класс-предок называется базовым, класс-потомок – производным. Наследники получают все свойства и методы предков, которые могут быть изменены, а также могут обладать собственными методами или свойствами. Наследование реализуется с помощью ключевого слова Inherits.

Например:Class Class1 Имя Базового Класса Class Basic не поддерживает множественное наследование. У каждого класса может быть только один родитель (базовый класс или суперкласс). Нельзя унаследовать свойства двух различных классов, но у каждого базового класса может быть свой базовый класс.

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

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

Один интерфейс – много методов.

Может понадобиться программа, которой требуется три типа СТЭКОВ (для хранения целых, вещественных чисел, для хранения символов).

Алгоритм, который реализует все стэки, будет один и тот же, хотя хранимые даны различны.

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

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

Полиморфизм организуется при помощи двух ключевых слов – Overridable и Overrides. Overridable используется на уровне базового класса, чтобы указать, что данная функция может переопределяться в производных классах. Overrides используется на уровне производного класса, чтобы указать, что данная функция переопределяет соответствующую функцию базового класса.

Абстрагирование – это метод решения сложных задач. Описывая поведение сложного объекта, мы выделяем только те стороны, которые нас интересуют с точки зрения решаемых задач. Т.е. строим его приближенную модель. Модель не может описать реальный объект полностью. Мы выделяем только те характеристики, которые важны для задачи. Нам надо абстрагироваться от несущественных деталей объекта.

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

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

Абстрагирование – это взгляд на объект ни как он есть на самом деле, а с точки зрения наблюдателя и интересующих его характеристик данного объекта.

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

Абстрагирование и инкапсуляция дополняют друг друга. Абстрагирование направлено на наблюдение за объектом, а инкапсуляция занимается внутренним устройством объекта – это сокрытие некоторых элементов абстракции (которые не затрагивают существенных характеристик объекта как целого).

Надо выделить две части в описании абстракции.

  • Первая – это интерфейс (взаимодействие).

Это основные характеристики состояния, поведения объекта. Он описывает внешнее поведение объекта типа class. Вообще описывает абстракцию поведения всех объектов данного класса. В этой части собрано все, что касается взаимодействия этого объекта с любыми другими объектами. “ То есть то, как сделано снаружи ” Бутч.

  • Вторая – реализация, представляет собой недоступные извне элементы реализации абстракции (внутренняя организация абстракции и механизмы реализации её поведения). Скрывает все детали.

“ То есть то, как сделано изнутри ” Бутч.

Наследование классов – это основа ООП, позволяет увеличить масштабируемость программ, реализовать повторное использование кода.

Программа, которая использует объекты базового класса может быть расширена без изменения старого кода путем построения производных классов от базового. Использование новых объектов в производных классах. Это достигается соглашением о наследовании: объекты производного класса содержат все элементы базового класса (поля и методы), как если бы эти элементы были описаны в самом производном классе.

Отпадает необходимость многократного переписывания одних и тех же определений базового класса, появляется возможность пользоваться ими, как они есть. В базовом классе надо определить какие права доступа мы предоставляем производным класса.

Производный класс может наследовать базовый как private, как public и как protected. Это влияет на возможность будущего расширения иерархии классов и интерпретации целей самого наследования.

Для создания нового класса внутри проекта необходимо выбрать пункт Add New Item / Class, после чего откроется окно нового класса.

Определение нового класса:

  • [Уровень_доступа] Class Имя_класса ‘имя – любое корректное
  • [Inherits Имя_класса-предка]
  • [Implements Имена_интерфейсов]

Список состава класса, свойства и методы нового класса Class

Уровень_доступа:

  • Public – полный доступ к классу.
  • Private – класс не виден за пределами модуля, в котором он был объявлен.
  • Protected – класс доступен внутри модуля, в котором он объявлен, и внутри модулей, где присутствуют классы-потомки.
  • Friend – доступ к классу только в пределах программы, в которой он объявлен (по умолчанию).
  • ProtectedFriend – класс доступен в пределах программы, в которой он объявлен, и внутри других программ, в которых присутствуют его классы-потомки.
  • MustInherit – класс не предназначен для создания экземпляров классов. Только его наследники класса могут использоваться для создания объектов.
  • NotInheritable -класс не может иметь наследников.

Для каждого элемента класса также можно установить разную видимость. Для этого используются те же ключевые слова, кроме MustInherit и NotInheritable.

Свойства

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

Простой синтаксис объявления свойства объекта:

Уровень_доступа Имя_свойства As Тип_свойства

Например: Public MyProperty As Integer

Читать и изменять значения свойства можно следующим образом:.MyProperty = 34

Однако в этом случае невозможно запретить изменение данного свойства и невозможно проверить корректность присваивания данных свойству.

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

  • Уровень_доступа Property Имя_свойства As Тип_свойства
  • Код, предназначенный для получения значения свойства
  • Название Свойства = Имя ПеременнойGet(ByVal значение As Тип_данных)
  • Код, предназначенный для установки свойства в значение
  • Имя Переменной = значениеSetProperty

Конструкция Get в процедуре свойства является функцией, которая возвращает значение свойства при его чтении. Если убрать ключевые слова Get и End Get, то получить значение данного свойства будет невозможно.

Конструкция Set отвечает за получение нового значения для свойства. Если удалить ключевые слова Set и End Set, то изменить значение данного свойства будет невозможно. Для досрочного выхода из конструкции Set используются ключевые слова Exit Property.

Методы

Методы – это процедуры или функции, принадлежащие объекту. Методы определяют поведение объекта. Для вызова метода объекта указывается объект, затем, через точку, название метода.

Например: MyObject.Method1

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

Методы могут быть открытыми и закрытыми.

Открытые методы составляют интерфейс класса, а закрытые используются для внутренних нужд класса.

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

В использовании деструкторов необходимости нет. Своевременным уничтожением объектов занимается сама среда («сборка мусора»). Явно вызвать деструктор можно с помощью метода Finalize.Basic позволяет определять несколько методов, имеющих одно и то же имя, но различный набор аргументов (перегрузка методов). При вызове метода будет выбран тот метод, набор аргументов которого совпадет с набором значений.

Для каждого свойства или метода, коды которого могут быть перегружены, необходимо заменить слово Public на Overridable. Слово Overrides используется при написании свойств и методов, коды которых будут отличаться от кодов свойств и методов исходного файла с теми же именами. События.

Для того чтобы объявить событие в классе, необходимо воспользоваться ключевым словом Event:

 Public Event EventName(event parameters)  

Можно определить событие следующим образом:

 Public Event EventName(ByVal sender as Object, ByVal e as System.EventArgs)  

Класс System.EventArgs определяет базовый класс аргументов события.

Для генерации событий внутри класса предназначен оператор RaiseEvent, которому в качестве аргумента передается имя события:EventName(параметры события) Модель событий в VB .NET выполнена на основе концепции делегатов – объектов, которые могут вызывать объектные методы. Для создания делегата используется ключевое слово

 Delegate.Delegate Sub StringSubDelegate(ByVal aString As String)  

Объявление объектов

После создания класса можно создавать внутри основной программы экземпляры данного класса. Для этого используется специальное ключевое слово New.

Существуют два способа создания экземпляров класса:

  • Позднее связывание MyInstance As Object
 MyInstance = New MyClass1()  

Создаем новую переменную MyInstance типа Object, затем объявляем эту переменную как экземпляр класса MyClass1.

  • Раннее связывание

Объектная переменная сразу объявляется как переменная заданного класса.

 Dim MyInstance As MyClass1= New MyClass1()   

Или сразу:

 Dim MyInstance As New MyClass1    

Лучше использовать раннюю привязку.

Абстрактные классы

Абстрактные классы не имеют самостоятельного применения, а используются только в качестве базовых для других классов.

Пример:
Public MustInherit Class Number
MustOverride Function AsString() As String
End Class 

Ключевое слово MustInherit означает, что данный класс предназначен только для создания производных классов; объекты класса Number создавать запрещено.

Атрибут MustOverride используется для декларирования функции, реализация которой предоставляется производному классу.

Интерфейсы

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

Для обращения из класса к нему самому можно использовать ключевое слово MyClass. Для обращения к базовому классу – MyBase.

Список использованной литературы