В чем разница между общедоступными и опубликованными учениками в Delphi?

26

Пожалуйста, может кто-нибудь объяснить мне, какая разница между публичными и опубликованными членами класса в Delphi?

Я попытался взглянуть на помощь Delphi, и я понимаю, что эти члены имеют одинаковую видимость, но я не очень хорошо понимаю, как они отличаются, и когда я должен использовать опубликованные члены вместо публичных.

Большое спасибо.

Теги:
oop
rtti
delphi-6

8 ответов

24
Лучший ответ

Публичные свойства и опубликованные свойства имеют одинаковую видимость, как вы уже говорили. Опубликованные свойства включены в RTTI, общедоступные свойства - нет.

  • 10
    RTTI расшифровывается как информация о типе времени выполнения или информация, необходимая компилятору Delphi во время разработки, чтобы заставить инспектор объектов и другие части Delphi IDE работать правильно во время разработки.
  • 4
    Для полноты: Delphi 2010 может также генерировать RTTI для открытых участников, фактически он может генерировать RTTI для всех участников, включая защищенных и частных. Но опубликованные члены все еще являются теми, которые «опубликованы» инспектором объектов и используются автоматическим механизмом потоковой передачи.
Показать ещё 1 комментарий
24

Компилятор генерирует метаданные RTTI (информация о типе времени выполнения) для опубликованных элементов, но не для открытых (по умолчанию). Основным результатом этого является то, что опубликованные свойства объекта появятся в Инспекторе объектов во время разработки.

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

общественного

public
  property MyProperty: integer read FMyProperty write FMyProperty

MyProperty не будет виден в Инспекторе объектов.

опубликованный

published
  property MyProperty: integer read FMyProperty write FMyProperty

MyProperty будет виден в Инспекторе объектов.

  • 3
    Несмотря на то, что это правильно, основная причина, по которой он появляется в инспекторе объектов, заключается в том, что метаданные RTTI присутствуют для опубликованных членов. Другими словами, то, что вы видите, является одним из эффектов основного различия. Более правильный ответ заключается в том, что опубликованные участники имеют RTTI, а открытые - нет.
  • 0
    @Lasse В. Карлсен: Да, вы правы. Но так как это, вероятно, самая заметная разница (?), И никакой другой ответ не указал на это, я воздержусь от удаления своего ответа прямо сейчас.
Показать ещё 3 комментария
9

В качестве побочного примечания есть еще одна особая вещь с опубликованной:

видимость по умолчанию для членов класса published, поэтому проверьте небезопасный код, например:

  TTopSecret = class(TObject)
    Name: string;
    Password: string;

    function DecryptPassword(const AValue): string;  
  public
    constructor Create(const AName, AEncryptedPassword: string);
  end; 

Name, Password и DecryptPassword() видны "во всем мире".

4

Кажется, что уже есть много хороших ответов, указывая на Object INspector, RTTI, и т.д. Это все части головоломки.

Если вы удалите опубликованное ключевое слово, весь дизайн инструмента Delphi RAD потребует определенного способа указать, какие свойства хранятся в DFM, проверяется в инспекторе свойств компонента и может быть перезагружен во время выполнения из DFM, когда форма или модуль данных.

Это, одним словом, для публикации. Мне интересно, что дизайнеры QT (первоначально TrollTech, позже входящие в Nokia, позже все еще выделившиеся в Digia) должны были эмулировать этот уровень RTTI для своей библиотеки С++ RAD "QT", добавляя "опубликованный" эквивалент и эквивалент "свойство", в то время как чистый С++ по-прежнему не имеет этого фундаментального объекта.

4

Опубликованные свойства будут экспортировать информацию типа времени выполнения (RTTI).

Посмотрите здесь о RTTI в Delphi

3

В дополнение к другим ответам:

Опубликованные свойства автоматически сохраняются в потоковой системе.

Например, если у вас есть экземпляр потомка TComponent и записывается в TStream с WriteComponent, все (ну, не все, но это еще один вопрос) опубликованные свойства записываются в поток без какого-либо дальнейшего кодирования.

Конечно, потоковая система может это сделать только потому, что RTTI доступен для опубликованных свойств.

  • 0
    Это, наверное, самое важное различие! RTTI - это просто «клей», необходимый для того, чтобы это произошло.
3

Информация о типе времени выполнения (RTTI) генерируется только для членов класса published.

  • 0
    Если не указано {$ M +} / {$ TYPEINFO ON}, в этом случае открытые члены также будут иметь RTTI
  • 0
    Если это правда, @Mjustin, то это изменение по сравнению с более ранними версиями Delphi. Раньше считалось, что без $ M + общедоступные и опубликованные были эквивалентны. То есть опубликованный раздел не генерировал RTTI, если не был задействован $ M +.
3

Во время выполнения записи в опубликованных и открытых разделах одинаково доступны.

Основное различие между ними заключается в том, что опубликованные элементы компонента отображаются в Object Inspector во время разработки.

Это происходит потому, что для полей в опубликованном разделе автоматически создается RTTI.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню