Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
C++Builder.doc
Скачиваний:
7
Добавлен:
01.04.2025
Размер:
15.66 Mб
Скачать

6.5 Методы

Компонентные методы ничем не отличаются от других объектных функции-членов. Хотя C++Builder не вводит никаких специальных ограничении на оформление компонентных методов, имеется ряд правил, которых стоит придерживаться:

1. Минимизируйте число методов, которые вызывает прикладной программист, чтобы использовать вашу компоненту. Многое из того, что вы намеревались реализовать в виде методов, вероятно, лучше инкапсулировать в свойства компоненты. В отличие от свойств, методы работают только во время исполнения программы.

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

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

4. Правильно защищайте методы. Все методы (включая конструкторы и .деструкторы), к которым имеют право обращаться пользователи вашей компоненты, следует объявлять как public. Все методы, к которым имеют право обращаться производные объекты вашей компоненты, следует объявлять как protected, что запрещает пользователям преждевременно вызывать методы, данные для которых еще не созданы. Только те методы, которые реализуют доступ к свойствам компоненты, должны быть объявлены как private, поскольку пользователи оперируют со значениями свойств напрямую.

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

6.5.1 Вызовы статических методов

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

class TFirstComponent : public Tcomponent

{

public:

void _fastcall Move() ;

void _fastcall Flash();

};

class TSecondComponent : public TPirstComponent { public:

void _fasfccall Move(); // отличен от наследованного метода

int _fastcall Flash(int HowOften); // тоже отличается };

Листинг 6.11. Переопределение статических методов.

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

6.5.2 Вызовы виртуальных методов

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

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

6.6 Иерархия классов VCL

Ранее в этой главе мы ознакомились с характеристиками четырех базисных типов компонент: стандартные, оригинальные, графические и невидимые. Теперь покажем место и назначение этих типов в иерархии объектов.

Рис. 6.7 показывает ключевые классы в иерархической структуре, от которых произведены все компоненты VCL. Каждый объект представляет некоторый набор методов, событий и свойств и имеет специальное назначение.

TObiect

TPersistent

TComponent

TControl

TGraphicControl TWinControl

TCustomControl

Рис. 6.7. Иерархия ключевых базовых классов VCL.

Подобно тому как TObject является базовым классом для всех порождаемых классов, TComponent является базовым классом для всех порождаемых компонент. $

Невидимые компоненты произведены от класса TComponent. Графические компоненты, не ассоциированные с оконными элементами управления, произведены от класса TGraphicControl.

Являясь оконными элементами, компоненты стандартного управления произведены непосредственно от класса TWinControl, а оригинальные компоненты — косвенно от класса TCustomControl, восходящего к TWinControl. Именно на уровне TWinControl и вводится "оконный дескриптор" (window handle). Рис. 6.8 S продолжает иерархическую структурную схему компонентных классов VCL.

* TButtonControl

о TButton

+ TBitBtn о TCustomCheckBox

+ TCheckBox

+ TDBCheckBox о TRadioButton

* TCustomComboBox о TComboBox о TDBComboBox о TDriveComboBox о TFilterComboBox

* TCustoinControl

о TCustomGrid

+ TCustomDBGrid + TDBGrid + TDBLookupList

+ TPopupGrid + TCustomOutline

+ TOutline + TDrawGrid

+ TStringGrid о TCustomGroupBox

+ TCustomRadioGroup + TDBRadioGroup + TRadioGroup

+ TGroupBox о TCustomPanei

+ TDBNavigator

+ TPanel о TDBImage о TDBLookupControl

+ TDBLookupComboBox

+ TDBLookupListBox

+ TPopupDataList о THeader о THintWindow о TMediaPlayer о TNotebook о TOleContainer о TPage о TScroller о TTabSet

* TCuatonEdit

о TCustomMaskEdit

+ TDBEdit

+ TInplaceEdit

+ TMaskEdit о TCustomMemo

+ TCustomRichEdit + TRichEdit

+ TDBMemo

+ TMemo о TDBLookupCombo о TEdit

* TCustomHotKey о THotKey

* TCuafcomListBox о TDBListBox о TDirectoryListBox о TFileListBox о TListBox

* TCuetomLietView о TListView

* TCuetomTabControl о TPageControl о TTabbedNotebook о TTabControl

* TCustomTreeView о TTreeView

* TCustomUpDown 0 TUpDown

* TDBCtrlGrid

* TDBCtrlPanel

* THeaderControl

* TOleControl

* TProgressBar

* TScrollBar

* TScrollingWinControl

о TForm

+ TDesignWindow + TInputReqDialog + TLoginDialog + TPasswordDialog

о TScrollBox

* TStatueBar

* TTabPage

* TTabSheet

* TTrackBar

Puc. 6.8. Дерево производных компонент от TCustomControl и TWinConlrol.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]