![]() |
Модераторы: Snowy, MetalFan, bems, Poseidon |
![]() ![]() ![]() |
|
Teleport |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 557 Регистрация: 5.7.2008 Где: Прибалтика Репутация: 1 Всего: 6 |
изучаю книжку по созданию компонентов. Обнаружил, что понятия не имею о некоторых секциях в коде.
private, public, published, protected - что это и чем отличаются? Знаю, что в private можно прописывать переменные и процедуры. Возможно неправильно выражаюсь. ![]() ![]() |
|||
|
||||
Qu1nt |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 602 Регистрация: 13.1.2007 Репутация: 22 Всего: 50 |
|
|||
|
||||
THandle |
|
|||
![]() Хранитель Клуба ![]() Награды: 1 Профиль Группа: Админ Сообщений: 3639 Регистрация: 31.7.2007 Где: Moscow, Dubai Репутация: 50 Всего: 372 |
Это все секции класса.
public - область видимости объявленных в ней членов(поля, функции, процедуру) без ограничений. Видимы повюду. published - тоже не имеет никаких ограничений на область видимости, но в ней перечисляются только свойства и события которые должны быть доступны не только на этапе выполнения программы, но и во время визуальноя разработки(то есть видны в Object Inspector). private - объявленные тут члены класса доступны в методах только самого класса и процедураъ/функциях того модуля, где калсс объявлен. protected - члены объявленные здесь доступны только методам самого класса и его потомкам, независимо от того где они находятся. |
|||
|
||||
Teleport |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 557 Регистрация: 5.7.2008 Где: Прибалтика Репутация: 1 Всего: 6 |
все понятно теперь
![]() ![]() ![]() |
|||
|
||||
Rrader |
|
|||
Inspired =) ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1535 Регистрация: 7.5.2005 Репутация: 18 Всего: 191 |
Эти секции по-другому еще называются уровнями инкапсуляции. Используются они для реализации такого понятия ООП, как инкапсуляция.
![]() public Все члены класса, расположенные здесь, доступны из любой точки программы. Обычно здесь располагаются свойства и методы для использования класса непосредственно по назначению. Могут быть и абстрактные методы. private Секция по умолчанию. Т.е. если имя секции отстутствует, то это - private Данные доступны только в том модуле, где класс описан. Здесь обычно располагаются поля класса и методы, задействованные в его базовой внутренней реализации. При "авто-завершении" (auto-complete) класса средой Delphi все сеттеры (Set<PropertyName>) и геттеры (Get<PropertyName>) помещаются в эту секцию. protected От private отличается тем, что члены класса доступны и любому из его потомков, даже если последний объявлен в другом модуле. Обычно здесь методы в перспективе на модифицирование, чтобы менять поведение класса (часто виртуальные и динамические), а также готовые методы, которые мог бы использовать класс-потомок, дополняя свою внутреннюю реализацию. Также могут быть и абстрактные методы. published Область видимости как у секции public. Но, помимо прочего, эти свойства будут доступны в Инспекторе Объектов для изменения. При "авто-завершении" (auto-complete) класса средой Delphi все свойства и методы, которые были объявлены вне какой-либо секции, помещаются сюда. automated Редко используемая секция. Члены здесь разрешается размещать, если класс унаследован от класса TAutoObject, чтобы создавать сервера автоматизации. Область видимости как и у public. Эта секция имеет ограничения на дефиниции свойств и методов из-за направленности на технологию COM. В Delphi 2007 появились две новые секции (работают как private и protected соответственно в С++ ): strict private Члены класса видны только самому классу и больше никому ![]() strict protected Члены класса видны только классу и его потомкам. Обработка секций 1) Секция без названия у класса вашей формы, унаследованного по умолчанию от TForm, обслуживается Delphi. Но область её видимости не private, а published 2) Секции private, protected, strict private, strict protected и public имеют отличия друг от друга только лишь в тексте кода Delphi (т.е. их реализация сугубо высокоуровневая). При конечной трансляции класса на ассемблер эти секции игнорируются. Все методы и поля едины ![]() 3) Секция published - для ее членов генерируется RTTI-информация. Тут тоже есть свои ограничения на дефиниции. И еще класс должен быть скомпилирован с директивой {$M+} 4) Секция automated - генерируется ATI-информация. Доступ к сгенерированной информации (п. 3 и 4) осуществялется через таблицу VMT (это по сути поле класса, но оно всегда скрыто, и всегда первое по счету) класса (по отрицательным смещениям). Секции могут дублироваться по именам (их может дублировать и среда Delphi при "авто-завершении" класса). При написании класса рекомендуется помещать секции в таком порядке:
|
|||
|
||||
Teleport |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 557 Регистрация: 5.7.2008 Где: Прибалтика Репутация: 1 Всего: 6 |
Спасибо, нужная информация
![]() |
|||
|
||||
de_Nis |
|
|||
![]() Старательный ![]() Профиль Группа: Участник Сообщений: 223 Регистрация: 19.10.2006 Где: Молдова Репутация: нет Всего: 6 |
Можно еще кое-что уточнить по поводу "private, public, published, protected"?
Область видимости процедур (функций, переменных...), находящихся в этих секциях, уже объяснили. То есть программист, в зависимости от своих задач, помещает объявление процедуры в нужную секцию. А как быть с процедурами, которые появляются в коде после, например, двойного щелчка по кнопке (procedure Button1Click(Sender: TObject);)? Их объявления автоматически появляются выше всех секций. Куда относятся эти процедуры, какая у них видимость? --------------------
Несчастлив не тот, у кого ничего нет, а тот, кто ничего не хочет… |
|||
|
||||
VICTAR |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1108 Регистрация: 6.10.2006 Репутация: 10 Всего: 80 |
||||
|
||||
de_Nis |
|
|||
![]() Старательный ![]() Профиль Группа: Участник Сообщений: 223 Регистрация: 19.10.2006 Где: Молдова Репутация: нет Всего: 6 |
Спасибо, VICTAR, понял ответ.
--------------------
Несчастлив не тот, у кого ничего нет, а тот, кто ничего не хочет… |
|||
|
||||
de_Nis |
|
|||
![]() Старательный ![]() Профиль Группа: Участник Сообщений: 223 Регистрация: 19.10.2006 Где: Молдова Репутация: нет Всего: 6 |
Процедуры (функции, переменные..), находящиеся в секции "... без названия у класса вашей формы, унаследованного по умолчанию от TForm..." - они относятся к процедурам (функциям, переменным..), объявленным внутри класса (как процедуры.... , объявленные, например, в секциях private, public)?
--------------------
Несчастлив не тот, у кого ничего нет, а тот, кто ничего не хочет… |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |