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

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

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

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


person Ondra C.    schedule 01.07.2010    source источник


Ответы (8)


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

person R-D    schedule 01.07.2010
comment
RTTI означает информацию о типе времени выполнения или информацию, которая требуется компилятору Delphi во время разработки, чтобы инспектор объектов и другие части среды разработки Delphi работали правильно во время разработки. - person Toby Allen; 02.07.2010
comment
Для полноты: Delphi 2010 может генерировать RTTI также для публичных членов, фактически может генерировать RTTI для всех членов, включая защищенные и частные. Но опубликованные члены по-прежнему публикуются инспектором объектов и используются механизмом автоматической потоковой передачи. - person Cosmin Prund; 02.07.2010
comment
Работает ли Free Pascal как Delphi 2010? Например, генерирует ли он RTTI для общедоступных свойств? Было бы безопасно не использовать опубликованные для простоты? - person jocull; 10.03.2018

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

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

Общественные

public
  property MyProperty: integer read FMyProperty write FMyProperty

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

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

published
  property MyProperty: integer read FMyProperty write FMyProperty

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

person Andreas Rejbrand    schedule 01.07.2010
comment
Хотя это правильно, основная причина того, почему он появляется в инспекторе объектов, заключается в том, что метаданные RTTI присутствуют для опубликованных членов. Другими словами, то, что вы видите, является одним из следствий лежащей в основе различия. Более правильный ответ: у опубликованных участников есть RTTI, а у открытых - нет. - person Lasse V. Karlsen; 01.07.2010
comment
@ Лассе В. Карлсен: Да, вы правы. Но поскольку это, вероятно, самая заметная разница (?), И ни один другой ответ еще не указал на это, я воздержусь от удаления своего ответа прямо сейчас. - person Andreas Rejbrand; 01.07.2010
comment
Извините, я недостаточно ясно выразился :) Согласен, это наиболее заметный эффект от разницы. Я хотел сказать, что вы должны указать, что основная разница - это RTTI, а не удалять свой ответ (хотя другие ответы сейчас указывают на RTTI). - person Lasse V. Karlsen; 01.07.2010
comment
Однако я думаю, что стоит отметить, что если вы задаете вопрос о разнице между общедоступными и опубликованными методами, то термин RTTI, вероятно, для вас тоже ничего не значит. Андреас дал очень полезный ответ. - person Toby Allen; 02.07.2010
comment
Но есть разница в методах. И в этом ответе об этом не упоминалось. По крайней мере, этот: только один конструктор может быть объявлен как опубликованный - перегруженные версии должны быть определены как общедоступные. отсюда delphibasics.co.uk/RTL.asp?Name=Published Более того, опубликованные свойства не могут возвращать массивы. - person Yevgeniy Afanasyev; 10.12.2014

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

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

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

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

Name, Password и DecryptPassword() видны «по всему миру».

person mjn    schedule 01.07.2010

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

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

person Ray    schedule 01.07.2010

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

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

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

person Warren P    schedule 01.07.2010

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

person splash    schedule 01.07.2010
comment
Если не указано {$ M +} / {$ TYPEINFO ON}, в этом случае открытые члены также будут иметь RTTI. - person mjn; 01.07.2010
comment
Если это правда, @Mjustin, то это изменение по сравнению с более ранними версиями Delphi. Раньше считалось, что без $ M + общедоступные и опубликованные были эквивалентны. То есть опубликованный раздел не генерировал RTTI, если действовал $ M +. - person Rob Kennedy; 01.07.2010

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

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

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

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

person Bharat    schedule 01.07.2010

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

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

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

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

person Uwe Raabe    schedule 01.07.2010
comment
Это, наверное, самое главное отличие! RTTI - это просто некий «клей», необходимый для того, чтобы это произошло. - person Roddy; 20.11.2014