Объекты Visual FoxPro

А теперь, дружок, я тебя буду пугать страшными словами, без знания которых у тебя ничего не получится, если ты вздумаешь заняться объектно-ориентированным программированием. Слова следующие: объект или сущность (entities), наследование (inheritance), инкапсуляция (encapsulation), полиморфизм (polymorphism). Вот. Я думаю, ты уже привык к шуткам автора и пугаться даже не собирался. И правильно сделал, потому что сейчас я тебе постараюсь объяснить смысл этих “страшных” терминов и все станет ясно и прозрачно. Начнем с понятия самого объекта.

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

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

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

Работает, и ладно.

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

Про объект ясно, а инкапсуляция? А про инкапсуляцию ты только что прочитал — объект инкапсулирует, т. е. включает в себя (или содержит в себе) всю необходимую информацию и набор функций, которые и определяют его поведение.

Данные, инкапсулированные в объекте, называются свойствами. Например, одно из свойств экранной формы — backcoior, определяет цвет фона формы. С точки зрения нашего Лиса, данное свойство представляет собой всего-навсего переменную памяти, которая может принимать определенные значения и которая присоединена к объекту и имеет область видимости только в пределах своего объекта.

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

А вот действия, которые происходят во “внешнем” мире и на которые объект должен реагировать, называются событиями. Классическим примером может служить такое событие, как щелчок мышью. Оно происходит по инициативе пользователя. А еще событие может наступить по инициативе самой программы, например:

1
2
3
IF BOF ()
=MESSAGEBOX ("ПОСЛЕДНЯЯ ЗАПИСЬ", "КОНЕЦ ФАЙЛА")
ENDIF

Теперь, чтобы уяснить суть оставшихся “страшных” слов, мы введем новое понятие, которое именуется как классы.

Классы

Если ты прочитал все ранее написанные статьи, ты уяснил следующее: в Visual FoxPro можно создавать объекты. А вот какой в этом практический смысл, наверное, пока непонятно. Действительно, в чем преимущества нового метода — ведь если для каждого приложения придется каждый раз создавать новые объекты — где же тут обещанные комфорт, экономия времени и нервов?

А вот именно для этого и существуют такие штуки, как классы. Именно они и являются той основой, при помощи которой создаются различные объекты.

Например, возьмем обычную тарелку. Ясно, что каждую тарелку никто не делает индивидуально. На заводе существует какая-то пресс-форма или шаблон, с помощью которой можно изготовить миллион одинаковых тарелок. Улавливаешь аналогию? Правильно, точно так же никто не собирается писать программный код для однотипных программных объектов — достаточно создать класс (этакую пресс-форму), а затем “наштамповать” сколько угодно объектов на основе данного класса. Причем все вновь созданные объекты будут являться экземплярами этого класса.

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

В Visual FoxPro для создания классов используются две команды: DEFINE CLASS и ENDDEFINE. Синтаксис первой команды следующий:

1
DEFINE CLASS Имя_Класса AS Имя_Класса_Родителя

Классом-родителем (superclass) называется тот базовый класс, на основе которого будет создан новый. Давай создадим класс на основе класса обычной формы:

1
2
3
4
5
6
 DEFINE CLASS Myform AS FORM
 Autocenter = .T.
 Caption = "MYFORM"
 Backcolor = RGB(0,255,0)
 Name - "MYFORM"
ENDDEFINE

Вот и все, создана обычная форма да еще и зеленого цвета. Теперь, чтобы посмотреть, как происходит процесс наследования, создадим объект на основе вновь созданного класса:

1
2
3
4
5
6
7
8
Oform=CREATEOBJECT ("Myform")
Oform.SHOW(l)
DEFINE CLASS Myform AS FORM
Autocenter = .T.
Caption = "MYFORM"
Backcolor = RGB(0,255,0)
Name = "Myform"
ENDDEFINE

Для создания экземпляра класса используется функция CREATEOBJECT ():

1
Oform = CREATEOBJECT("Myform")

To есть создается некоторая переменная типа object на основе указанного класса. Теперь представь, что мы создали очень много каких-то объектов на основе какого-то класса и по какой-то причине приходится изменить у них У всех какое-то свойство. Можно сделать “по-старинке”, вручную установив для каждого необходимое значение свойства. А объектов-то этих самых ты уже сотворил 15 487 шт!

Как быть?

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

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

Таким образом, мы уяснили, что в Visual FoxPro можно создавать новые классы на основе уже имеющихся. А что такое “уже имеющиеся”? Это так называемые базовые классы или суперклассы, которые поставляются вместе с данным программным продуктом.

Композитные классы

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

1
2
ADD OBJECT имя_объекта AS имя__класса
WITH переменная=зиачение

Применительно к нашему случаю:

1
2
3
4
5
6
7
8
9
10
11
12
13
Of orm=CREATEOBJECT ("Myf orra")
Oform.SHOW(l)
DEFINE CLASS Myform AS FORM
Autocenter = .T.
Caption = "Myform"
Backcolor - RGB(0,255,0)
Name = "Myform"
ADD OBJECT Mylabel AS LABEL;
WITH Caption="Примep композитного класса",;
Autosize=.T.,;
Top=40,;
Left=100
ENDDEFINE

И вот что получилось

Пример добавления в класс объекта из другого класса

Другой способ — использование метода ADDOBJECTO. Применяя данный метод, мы получим аналогичный результат:

1
2
3
4
5
6
7
8
9
10
Oform=CREATEOBJECT ("Form")
Oform.Autocenter=.T.
Oform.Caption="Myform"
Oform.ADDOBJECT("Mylabel","LABEL")
Oform.Mylabel.Caption="Пример Композитного Класса"
Oform.Mylabel.Autosize=.T.
Oform.Mylabel.Top=40
Oform.Mylabel. Lef t=100
Oform.Mylabel.Visible=.T.
Oform.SHOW(1)

Ясно видно различие между ADD OBJECT И ADDOBJECTO. При использовании ADD OBJECT свойства объекта можно задать в одном операторе, а при использовании ADDOBJECT( ) это придется делать отдельно. Применяя ADDOBJECT(), нужно не забывать устанавливать свойство visible — .т. (для визуальных объектов).

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100