Објектниот модел на Gambas
1. Објекти и Класи
Објект во
Gambas е податочна структура што содржи
својства,
променливи,
методи и
настани.
До објектите се достапува „по референца“, т.е. со помош на поинтер, што е всушност посебна
променлива чија вредност е адресата на податочната структура на
објектот во меморијата.
 |
Адресата на објектот можете да ја видите со помош на инструкцијата PRINT:
DIM aStr AS NEW String[]
PRINT aStr
(String[] 0x80dccf8)
|
Податочната структура на
објектот е опишана со
класа.
1.1. Класи
Секој објект од
Gambas има соодветна
класа што ги опишува сите негови јавни својства, методи и настани.
Оваа класа е, исто така, објект од
Gambas, чија е класа е класата со име
Class.
Статичка класа е класа чии членови се сите
статички (видете подолу). Во
Gambas, статичка
класа се нарекува уште и
модул.
Example
Класата
System е статичка класа: сите нејзини методи се статички и не е можно да се создаде
објект чија
класа би била
System.
Виртуелна класа е скриена псевдокласа со која не можете директно да манипулирате.
1.2. Својства, методи и променливи
Својствата и методите овозможуваат манипулација со податочните структури.
Својствата, методите или променливите можат да бидат
статички:
- Статичката променлива е споделена од сите инстанци (т.е. сите создадени објекти) од истата класа.
- Статичкото својство или метод може да модифицира само статички променливи.
Методите или променливите можат да биде
јавни (public) или
приватни (private). Својствата секогаш се јавни.
Приватните симболи можат да се користат само во класата во која се дефинирани.
Јавните симболи можат да се користат во целата програма, под услов да имате референца до соодветниот објект.
1.3. Настани
Настаните се сигнали што објектот ги испраќа кога нешто ќе му се случи.
Ако објектот објавува настани, тој ќе има референца до неговиот
набљудувач или
родителски објект.
Набљудувачот е друг објект што имплементира
рачуваќи со настани.
Ракувач со настан е обичен јавен
метод што се повикува секогаш кога ќе се објави
настан.
Обично, набљудувачот е тековниот објект каде што е деклариран новосоздадениот (инстанцираниот) објект објект.
За да објави настан, објектот мора да име
настанско име. Ова настанско име се доделува при инстанцирањето на објектот, со помош на инструкцијата
NEW и клучниот збор
AS и тоа е префикс на сите методи - ракувачи со настани.
Example
Ова создава
Button што ќе објавува настани.
DIM hKopce AS Button
hKopce = NEW Button(ME) AS "KopceImeNaNastan"
Ако не е наведено настанско име,
објектот нема да објавува настани.
Објектот може да се заклучи така што ќе престане да објавува настани и може да се отклучи така повторно ги објавува.
Видете ги методите
Object.Lock и
Object.Unlock.
Некои настани можат да бидат откажани од ракувачот на настани со помош на инструкцијата
STOP EVENT.
Ефектот на откажувањето зависи од
настанот.
1.4. Референци
Во
Gambas не постои
garbage collection. Секој објект си има „бројач на референци“ што се инкрементира секогаш кога објектот ќе се референцира од која било
променлива, низа, колекција, низа или друг објект и се намалува кога објектот ќе се ослободи.
Овој бројач на референци при создавањето на објектот е 0 и кога повторно ќе стане нула при ослободувањето на некоја референца, објектот се уништува и меморијата што ја зафаќал се враќа на системот.
1.5. Невалидни објекти
Објектот може да стане
невалиден. Тоа може да се случи кога, на пример, е поврзан со интерен објектот што не е управуван од
Gambas, а кој пак е уништен.
Обидот за употреба на невалиден објект предизвикува објавување грешка.
1.6. Специјални методи
Специјалните методи се декларираат во класи чие име почнива со потцртичка и се повикуваат од страна на интерпретерот во следниве ситуации:
- При создавање објект.
- При уништување објект.
- При вчитување на класата на објектот.
- При исфрлање на класата на објектот од меморијата.
- При употреба на објектот како тој да е низа.
- При пребројувањето на објектот.
- При употребата на објектот како да е функција.
- При обид за употреба на непознат метод или својство на објектот.
Видете
/api/cat/special за повеќе информации.
2. Наследување
Наследувањето е начин на кој се создава класа што е специјализирана верзија на друга класа.
2.1. Што се наследува?
Класата од својот родител ги наследува сите
методи,
својства, константи и
настани.
 |
За да достапите до наследените елементи од родителската класа во внатрешноста на тековната класа морате да го користите клучниот збор ME.
|
2.2. Која класа може да биде родителска класа?
Можете да наследите која било класа, дури и природна!
На пример, можете да создадете класа MyListBox што ја наследува класата
ListBox, но ви овозможува да асоцирате по еден број со секоја ставка на листата.
Забележете дека не можете да го користите зборот
INHERITS во датотека со класа што опишува форма, бидејќи формите веќе ја наследуваат класата
Form.
 |
Длабочината на стеблото на наследување не може да биде поголема од 16. Ова е константа што е вградена во Gambas интерпретерот.
|
2.3. Виртуелно проследување
При повикување на
метод или достап до
својство од референца на објект,
Gambas секогаш користи
виртуално проследување.
Тоа значи дека секогаш се користи вистинската класа на објектот, а не податочниот тип на
променливата што го референцира објектот - како што било случај во
Gambas 1.0.
2.4. Наследување и конструктори
За разлика од сите објектни јазици што ги познавам, секоја класа во хиерархијата на наследувањето ги прима параметрите проследени до конструкторот.
Да претпоставиме дека го имаме следново стебло на наследување:
MyListBox ---ја наследува--> ListBox ---ја наследува---> Control
- Control._new() не постои.
- ListBox._new() прифаќа еден параметар: родителската контрола.
- MyListBox._new() прифаќа еден параметар: име - ова е само за пример.
Па така,
NEW MyListBox ќе прифати два параметри:
- Првиот ќе биде проследен до MyListBox._new().
- Вториот ќе биде проследен до ListBox._new().
Внимавајте: прво ќе се создаде
ListBox._new(), па така сте сигурни дека контролата
ListBox веќе постои кога се извршува MyListBox._new().
Според тоа, аргументите треба да се наведуваат во обратен редослед.
Ова ќе ја создаде контролата MyListBox на следниов начин:
hMyListBox = NEW MyListBox("Ime", hContainer)
3. Компоненти
Gambas компонентите се надворешни споделени библиотеки пишувани во C, C++ или
Gambas што додаваат нови функции и/или класи на
Gambas интерпретерот.
Класите се групираат според компонентите од кои доаѓаат.
3.1. Стандардни интерни компоненти
Интерпретерот содржи стандардна интерна компонента со име
gb што ги дефинира сите стандардни класи на јазикот.
Оваа компонента секогаш се вчитува и може да се смета како дел од јазикот.
3.2. Табели на симболи
Секоја компонента има сопствена приватна табела на симболи на класи, така што имињата на класите не доаѓаат во конфликт.
3.3 Глобална табела на симболи
За да се овозможи заедничка работа на компонентите, постои глобална табела на симболи, каде што се чуваат сите класи што се извезени од компонентите и од тековниот проект.
Ако постои конфликт на имињата во глобалната табела на симболи, последната вчитана класа има предност пред претходно вчитаната класа со исто име со употреба на наследување. Со други зборови, класата што има предност е проширување на класата што нема предност.
Оваа особина може да се искористи за:
- Проширување на веќе декларирана класа со додавање на нови методи или својства. На пример, класата gb.qt Application претставува реимплементација на gb Application.
- Пренебрегнување на веќе декларирана класа. На пример, компонентата gb.form.dialog ги заменува статичките методи на класата Dialog.
3.4 Табела на симболи на проектот
Вашиот проект има сопствен приватен симбол како и секоја
компонента и може да извезе која било од своите класи во глобалната табела на симболи со помош на клучниот збор
EXPORT.
Класите на проектот се вчитуваат по сите компоненти. Така, вашите извезени
класи имаа предност пред извезените класи што се декларирани во која било
компонента.