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