Классы в VB
Home Up Элемент TreeView CompControl Простейшая БД Классы в VB

Часть первая

Понятие класса

Итак, поехали!

Начнем мы с определений. Это нужно для вашего постепенного превращения из чайников в подкованных программистов.

Что же такое классы? Классы - это компоненты многократного использованиякомпоненты многократного использования. Вы наверняка используете в своих программах стандартные элементы управления. Такие, как TextBox, например. Так вот элемент управления TextBox - это и есть класс. Вы же его многократно используете? Да, многократно. Я бы еще сказал, что классы - это шаблоны объектов многократного использования.

Существует такое понятие, как экземпляр класса. Т.е., сам элемент управления TextBox, который находится на панели элементов рядом с другими элементами управления (Label, ImageBox, PictureBox и пр.), является классом или шаблоном для всех текстовых полей, которые вы создадите в своей программе при помощи этого элемента управления. По этому шаблону создается любое текстовое поле со стандартными для него свойствами. У вас же ни разу не создавалось нестандартное текстовое поле при использовании элемента управления TextBox?

Элемент управления TextBox - это класс, шаблон. Когда вы создаете текстовое поле в своей программе, вы создаете экземпляр текстового поля, т.е. экземпляр класса текстового поля. Этот экземпляр каждый раз создается по одному и тому же шаблону TextBox. В этом и есть суть многократного использования. Однажды создав шаблон, вы можете его использовать для создания экземпляров этого шаблона многократно в своей программе. И каждый экземпляр при этом будет иметь свои значения свойств.

Например, создав три текстовых поля, вы создадите три экземпляра класса TextBox. У них будут одинаковые свойства, но для каждого из этих экземпляров вы можете установить свои значения свойств. Например, свойство Text. Вы можете записать в это свойство разный текст. Вот в этом и есть прелесть классов. Единожды создав шаблон, мы получаем возможность создавать и использовать множество его экземпляров. И у каждого экземпляра будут свои значения свойств. Это просто здорово! Благодаря этому у нас на форме может существовать множество текстовых полей, у которых будут свои индивидуальные настройки. Одно будет невидимым, другое с полосами прокрутки, третье недоступным и т.д.

Так мы плавно подошли к следующему понятию - объекты.

А все очень просто. Объекты - это экземпляры класса. Думаю, здесь все уже должно быть понятно.

Ну, а раз перешли к объектам, то обратимся к понятию Объектно-ориентированное программирование (ООП).

Объектно-ориентированное программирование (ООП) - это способ создания программ из многократно используемых объектов. То бишь классов (шаблонов). Не используя прелести объектно-ориентированного программирования, вам бы пришлось самим создавать текстовое поле. Рисовать его на форме, делать ему заливку белым цветом. Прорисовывать на нем курсор. При нажатии клавиши с символом отображать его на позиции курсора… Короче, одна сплошная мука! И это только для того, чтобы создать простое текстовое поле! Но, слава Богу, у нас есть объектно-ориентированное программирование. Есть класс (шаблон) TextBox, на основе которого мы создаем объект текстового поля. При этом нам не нужно заботиться о прорисовке текстового поля, отображении курсора, выводе символов… и т.п. За нас это уже давно сделали добрые дяди из Microsoft. Мы даже не знаем, как это там происходит! И не нужно знать!!! В этом еще одна прелесть объектно-ориентированного программирования. И эта прелесть называется Инкапсуляция.

Инкапсуляция означает сокрытие информации, это означает, что объекты скрывают детали своей работы. Нам неизвестно, что происходит в текстовом поле, когда мы меняем свойство Text. Наверняка там происходит накопление символов в одной переменной (что-то типа sTemp=sTemp+символ_нажатой_клавиши), но мы этого не знаем наверняка. И это нас не должно волновать. Это и есть Инкапсуляция.

Еще одно понятие ООП - Наследование.

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

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

Еще одно понятие ООП - Полиморфизм. Многие объекты могут иметь одноименные методы. Тем не менее, у каждого объекта эти методы могут выполнять разные действия, определенные именно для этого объекта.

Типичный пример полиморфизма - использование оператора "+" для сложения строк и чисел. Для чисел это будет означать суммирование, а для строк - слияние. Visual Basic уже сам разберет, к чему какой метод применять, хотя используется один и тот же оператор.

 

Итак, подведем итог важнейших понятий ООП:

Инкапсуляция
Наследование
 Полиморфизм

Если вы хотите стать подкованным программистом, то эти понятия вы должны знать. Повторюсь вкратце.

Инкапсуляция - сокрытие.

Наследование - тут все и так ясно.

Полиморфизм - методы для разных объектов с одинаковыми названиями, выполняющие разные действия для разных объектов.

Часть вторая

Создание класса

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

Для начала определимся, зачем Сообчайлеру вообще нужен какой-либо класс. Выше я говорил, что класс - это компонент многократного использования, шаблон. Что у нас в Сообчайлере будет многократно использоваться и иметь при этом свои свойства? Я думаю, это будут почтовые ящики - Box. Их будет много, пользователь будет постоянно добавлять новые, при этом у каждого почтового ящика будут свои свойства. Например, Имя почтового ящика, Адрес POP3-сервера, Адрес SMTP-сервера, Пароль на сессию и пр.

Можно было бы сделать это все через массивы. Например, организовать массив имен ящиков, массив адреса POP3, адреса SMTP, массив паролей. Для первого ящика это выглядело бы так:

Name=BoxName(1)

SMTP=SMTPServer(1)

POP3=POP3Server(1)

Pass=Password(1)

И дальше в программе просто использовать эти массивы. Но это жутко неудобно. Во-первых, мы не знаем количество ящиков, которое захочет создать пользователь. Придется каждый раз менять границы массива. Вдобавок придется вводить переменные для хранения максимального числа элементов массива, чтобы мы могли объявлять циклы For I=1 To MaxNumberBoxs. Это лишний расход памяти. А как быть с удалением? Допустим, создал пользователь два ящика и захотел удалить последний. Окей, мы исключаем последний элемент из всех массивов и меняем размер массива с помощью оператора ReDim. А как быть, если он захочет удалить первый ящик? Придется создавать еще по временному массиву на каждый из уже созданных, для их перезаписи без к.л. среднего элемента. Т.е. мы будем создавать временный массив, в который перепишем все элементы, кроме удаляемого, а затем из временного массива переписывать все это дело обратно. Это уже чревато двумя наиболее критичными проблемами: перерасход памяти (свойств-то много!) и увеличение времени быстродействия. Кому наша программа будет нужна, если при работе с десятью ящиками на удалении одного из них она будет тратить порядка минуты и при этом еще и занимать в памяти 20 Мб?

И, пожалуй, самое главное: А ЕСЛИ МЫ ЗАХОТИМ ДОБАВИТЬ НОВОЕ СВОЙСТВО? Для этого необходимо перелопатить весь набранный код. При этом обязательно мы где-то забудем это сделать. Как результат - баги. Время на их исправление. Морока с массивами. Короче, я сомневаюсь, что мы вообще сможем в таком случае дописать программу до конца. Просто не хватит терпения. А ведь есть еще и папки (Folder), которые тоже имеют свои свойства… А еще сообщения… Мрачная картина вырисовывается…

НО! Мы можем создать класс (шаблон) clsBox. И по этому шаблону создавать почтовый ящик. Создадим свой первый класс - класс почтового ящика. Можно вручную добавить модуль класса через меню Project/Add Class Module выбрав в появившемся меню Class Module или сделать это с помощью построителя классов, выбрав VB Class Builder в том же меню. Выберем второе, чтобы не удаляться далеко в дебри создания классов.

Вылезет меню построителя классов. Создадим новый класс при помощи меню File\New\Class или просто щелкнув на левой крайней иконке на панели инструментов. Зададим ему имя clsBox. Жмем ОК. Вот и добавили новый класс.

Теперь создадим несколько свойств. Для создания нового свойства щелкните по третьей кнопке на панели инструментов. Назовем это свойство BoxName - в нем будет храниться имя ящика. Выберем в Data Type значение String, т.к. имя ящика - это символы. Оставим переключатель на Public Property - в следующих выпусках мы рассмотрим все подробнее. Жмем ОК. Все. Первое свойство готово. Добавим еще несколько свойств: POP3Server, SMTPServer и Password. Тип данных для всех будет String.

Все. Закрываем окно построителя классов. Выскочит окошко с предложением произвести изменения в проекте. Жмем ОК. Все. Класс готов к употреблению.

Для употребления необходимо объявить его в своей программе

Dim Box As New clsBox

Что в переводе означает: объявить Box как новый экземпляр класса clsBox. При этом данный экземпляр класса clsBox будет иметь все только что созданные свойства. Наберите Box и нажмите точку. ВИДИТЕ??? Появился список с перечислением свойств, совсем как для текстового поля!!!! Теперь вы можете оперировать с этими свойствами. Например, так

Box.BoxName = "Verter"

Debug.Print Box.BoxName

Таким образом, вы можете создать экземпляр для второго ящика:

Dim Box2 As New clsBox

И использовать:

Box2.POP3Server = "compnet.dgrad.ru"

Debug.Print Box2.POP3Server

Для третьего - Dim Box3 As New clsBox и т.д.

Для уничтожения ящика просто применить Box2 = Nothing

Попробуйте добавить это:

Box2 = Nothing

Debug.Print Box2.POP3Server

У вас произойдет ошибка, ибо мы сперва уничтожили объект под именем Box2.

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

 

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

Воспользуемся построителем классов. Для создания коллекции нажмем вторую слева кнопку на панели инструментов. Зададим ей имя colBoxes. Выберем справа в окошечке наш класс clsBox как базовый для нашей коллекции. Жмем ОК. Все, коллекция готова. Закрываем построитель и соглашаемся с изменениями.

Теперь мы можем создать коллекцию одного экземпляра класса clsBox и работать уже с ней.

Коллекции классов имеют стандартные методы:

Add - для добавления в коллекцию

Remove - для удаления

Item - номер элемента в коллекции

На остальных мы остановимся позже.

Объявим класс и коллекцию:

Dim classBox As New clsBox

Dim Box As New colBoxes

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

Box.Add "Verter", "compnet.dgrad.ru", "compnet.dgrad.ru", "password"

Добавим второй ящик

Box.Add "Allin", "mail.ru", "mail.ru", "password"

Третий…

Box.Add "Evgeniy", "chat.ru", "chat.ru", "password"

Теперь посмотрим POP3-сервер для второго ящика. Используем свойство Item.

Debug.Print Box.Item(2).POP3Server

Выведет mail.ru

Удалим второй ящик:

Box.Remove 2

Автоматически коллекция сдвинется на одну позицию. Теперь третий ящик станет вторым и

Debug.Print Box.Item(2).POP3Server

нам выдаст

chat.ru

Теперь у нас два ящика и

Debug.Print Box.Item(3).POP3Server

приведет к ошибке.

Все просто донельзя! И не надо мучаться с массивами!

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

Автор: Ильин Евгений aka Verter

Email: verter@compnet.dgrad.ru

В следующем выпуске:

Глобальные переменные в классе
Процедуры свойств
Добавление в класс методов
А также стандартные свойства коллекций
 

 

Home ] Up ] О группе ] Исходники ] Орфография ] Приёмы ] Проекты ] Наша рассылка ]

Хостинг от uCoz