Пожалуйста, может кто-нибудь объяснить мне, какая разница между публичными и опубликованными членами класса в Delphi?
Я попытался взглянуть на помощь Delphi, и я понимаю, что эти члены имеют одинаковую видимость, но я не очень хорошо понимаю, как они отличаются, и когда я должен использовать опубликованные члены вместо публичных.
Большое спасибо.
Публичные свойства и опубликованные свойства имеют одинаковую видимость, как вы уже говорили. Опубликованные свойства включены в RTTI, общедоступные свойства - нет.
Компилятор генерирует метаданные RTTI (информация о типе времени выполнения) для опубликованных элементов, но не для открытых (по умолчанию). Основным результатом этого является то, что опубликованные свойства объекта появятся в Инспекторе объектов во время разработки.
Я не знаю, пишете ли вы компоненты, но если вы это делаете, вы, вероятно, знаете, что свойства и события обычно публикуются, поэтому их можно установить с помощью инспектора объектов.
public
property MyProperty: integer read FMyProperty write FMyProperty
MyProperty
не будет виден в Инспекторе объектов.
published
property MyProperty: integer read FMyProperty write FMyProperty
MyProperty
будет виден в Инспекторе объектов.
В качестве побочного примечания есть еще одна особая вещь с опубликованной:
видимость по умолчанию для членов класса published
, поэтому проверьте небезопасный код, например:
TTopSecret = class(TObject)
Name: string;
Password: string;
function DecryptPassword(const AValue): string;
public
constructor Create(const AName, AEncryptedPassword: string);
end;
Name
, Password
и DecryptPassword()
видны "во всем мире".
Кажется, что уже есть много хороших ответов, указывая на Object INspector, RTTI, и т.д. Это все части головоломки.
Если вы удалите опубликованное ключевое слово, весь дизайн инструмента Delphi RAD потребует определенного способа указать, какие свойства хранятся в DFM, проверяется в инспекторе свойств компонента и может быть перезагружен во время выполнения из DFM, когда форма или модуль данных.
Это, одним словом, для публикации. Мне интересно, что дизайнеры QT (первоначально TrollTech, позже входящие в Nokia, позже все еще выделившиеся в Digia) должны были эмулировать этот уровень RTTI для своей библиотеки С++ RAD "QT", добавляя "опубликованный" эквивалент и эквивалент "свойство", в то время как чистый С++ по-прежнему не имеет этого фундаментального объекта.
Опубликованные свойства будут экспортировать информацию типа времени выполнения (RTTI).
Посмотрите здесь о RTTI в Delphi
В дополнение к другим ответам:
Опубликованные свойства автоматически сохраняются в потоковой системе.
Например, если у вас есть экземпляр потомка TComponent и записывается в TStream с WriteComponent, все (ну, не все, но это еще один вопрос) опубликованные свойства записываются в поток без какого-либо дальнейшего кодирования.
Конечно, потоковая система может это сделать только потому, что RTTI доступен для опубликованных свойств.
Информация о типе времени выполнения (RTTI) генерируется только для членов класса published
.
Во время выполнения записи в опубликованных и открытых разделах одинаково доступны.
Основное различие между ними заключается в том, что опубликованные элементы компонента отображаются в Object Inspector во время разработки.
Это происходит потому, что для полей в опубликованном разделе автоматически создается RTTI.
Инспектор объектов выбирает это и использует его для определения того, что добавить в свой список свойств и событий.