Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

public
  property MyProperty: integer read FMyProperty write FMyProperty

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

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

published
  property MyProperty: integer read FMyProperty write FMyProperty

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

Ответ 3

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

видимость по умолчанию для членов класса 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

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

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

Ответ 5

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

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

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

Ответ 6

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

Ответ 7

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

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

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

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

Ответ 8

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

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

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

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