Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> private, public, published, protected - значение.. 
V
    Опции темы
Teleport
Дата 30.8.2008, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 557
Регистрация: 5.7.2008
Где: Прибалтика

Репутация: 1
Всего: 6



изучаю книжку по созданию компонентов. Обнаружил, что понятия не имею о некоторых секциях в коде.
private, public, published, protected - что это и чем отличаются? Знаю, что в private можно прописывать переменные и процедуры. Возможно неправильно выражаюсь. smile Поясните, пожалуйста.  smile 


--------------------
user posted image
user posted image 
PM MAIL   Вверх
Qu1nt
Дата 30.8.2008, 14:27 (ссылка) |  (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 13.1.2007

Репутация: 22
Всего: 50



Цитата(wikipedia)

 TMyClass = class(TObject)
 private
   {Описанные в этой секции элементы не доступны извне (за пределами класса).}
   {Здесь обычно находятся поля класса.}
 protected
   {Описанные в этой секции элементы доступны только классу и всем его потомкам.}
 public
   {Описанные в этой секции элементы доступны всем.}
 published
   {Описанные в этой секции элементы доступны всем и отображаются в Object Inspector'e.}
 end;

PM MAIL   Вверх
THandle
Дата 30.8.2008, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 50
Всего: 372



Это все секции класса.

public - область видимости объявленных в ней членов(поля, функции, процедуру) без ограничений. Видимы повюду.
published - тоже не имеет никаких ограничений на область видимости, но в ней перечисляются только свойства и события которые должны быть доступны не только на этапе выполнения программы, но и во время визуальноя разработки(то есть видны в Object Inspector).
private - объявленные тут члены класса доступны в методах только самого класса и процедураъ/функциях того модуля, где калсс объявлен.
protected - члены объявленные здесь доступны только методам самого класса и его потомкам, независимо от того где они находятся.
PM   Вверх
Teleport
Дата 30.8.2008, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 557
Регистрация: 5.7.2008
Где: Прибалтика

Репутация: 1
Всего: 6



все понятно теперь smile спасиб smile разобрался  smile 


--------------------
user posted image
user posted image 
PM MAIL   Вверх
Rrader
  Дата 1.9.2008, 13:43 (ссылка) |   (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 18
Всего: 191



Эти секции по-другому еще называются уровнями инкапсуляции. Используются они для реализации такого понятия ООП, как инкапсуляция. smile Последняя позволяет проектировать классы как некий законченный продукт, скрывая его внутренние механизмы от конечного пользователя. Существование секций инкапсуляции позволяет также реализовывать некоторые паттерны проектирования (например, Singleton).

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
Члены класса видны только самому классу и больше никому smile 

strict protected
Члены класса видны только классу и его потомкам.

Обработка секций

1) Секция без названия у класса вашей формы, унаследованного по умолчанию от TForm, обслуживается Delphi. Но область её видимости не private, а published
2) Секции privateprotectedstrict privatestrict protected и public имеют отличия друг от друга только лишь в тексте кода Delphi (т.е. их реализация сугубо высокоуровневая). При конечной трансляции класса на ассемблер эти секции игнорируются. Все методы и поля едины smile
3) Секция published - для ее членов генерируется RTTI-информация. Тут тоже есть свои ограничения на дефиниции. И еще класс должен быть скомпилирован с директивой {$M+}
4) Секция automated - генерируется ATI-информация. 

Доступ к сгенерированной информации (п. 3 и 4) осуществялется через таблицу VMT (это по сути поле класса, но оно всегда скрыто, и всегда первое по счету) класса (по отрицательным смещениям).

Секции могут дублироваться по именам (их может дублировать и среда Delphi при "авто-завершении" класса).

При написании класса рекомендуется помещать секции в таком порядке:
  • strict private
  • strict protected
  • protected
  • public
  • published
  • automated



--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
Teleport
Дата 1.9.2008, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 557
Регистрация: 5.7.2008
Где: Прибалтика

Репутация: 1
Всего: 6



Спасибо, нужная информация smile


--------------------
user posted image
user posted image 
PM MAIL   Вверх
de_Nis
Дата 4.9.2008, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Старательный
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 19.10.2006
Где: Молдова

Репутация: нет
Всего: 6



Можно еще кое-что уточнить по поводу "private, public, published, protected"?
Область видимости процедур (функций, переменных...), находящихся в этих секциях, уже объяснили. То есть программист, в зависимости от своих задач, помещает объявление процедуры в нужную секцию. А как быть с процедурами, которые появляются в коде после, например, двойного щелчка по кнопке (procedure Button1Click(Sender: TObject);)? Их объявления автоматически появляются выше всех секций. Куда относятся эти процедуры, какая у них видимость?


--------------------
Несчастлив не тот, у кого ничего нет, а тот, кто ничего не хочет…
PM   Вверх
VICTAR
Дата 4.9.2008, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1108
Регистрация: 6.10.2006

Репутация: 10
Всего: 80



Цитата(Rrader @  1.9.2008,  14:43 Найти цитируемый пост)
1) Секция без названия у класса вашей формы, унаследованного по умолчанию от TForm, обслуживается Delphi. Но область её видимости не private, а published


PM MAIL   Вверх
de_Nis
Дата 4.9.2008, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Старательный
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 19.10.2006
Где: Молдова

Репутация: нет
Всего: 6



Спасибо, VICTAR, понял ответ.
--------------------
Несчастлив не тот, у кого ничего нет, а тот, кто ничего не хочет…
PM   Вверх
de_Nis
Дата 4.9.2008, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Старательный
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 19.10.2006
Где: Молдова

Репутация: нет
Всего: 6



Процедуры (функции, переменные..), находящиеся в секции "... без названия у класса вашей формы, унаследованного по умолчанию от TForm..." - они относятся к процедурам (функциям, переменным..), объявленным внутри класса (как процедуры.... , объявленные, например, в секциях private, public)?
--------------------
Несчастлив не тот, у кого ничего нет, а тот, кто ничего не хочет…
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0850 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.