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

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

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

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

29
задан Toby Allen 1 July 2010 в 23:06
поделиться

8 ответов

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

25
ответ дан 28 November 2019 в 00:59
поделиться

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

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

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

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

Имя , Пароль и DecryptPassword () видны «во всем мире».

9
ответ дан 28 November 2019 в 00:59
поделиться

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

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

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

4
ответ дан 28 November 2019 в 00:59
поделиться

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

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

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

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

3
ответ дан 28 November 2019 в 00:59
поделиться

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

3
ответ дан 28 November 2019 в 00:59
поделиться

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

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

Public

public
  property MyProperty: integer read FMyProperty write FMyProperty

MyProperty не будет отображаться в инспекторе объектов.

Опубликовано

published
  property MyProperty: integer read FMyProperty write FMyProperty

MyProperty будет отображаться в Инспекторе объектов.

26
ответ дан 28 November 2019 в 00:59
поделиться

Опубликованные свойства экспортируют Runtime Type Information (RTTI).

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

4
ответ дан 28 November 2019 в 00:59
поделиться

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

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

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

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

3
ответ дан 28 November 2019 в 00:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: