В чем разница между общедоступными и опубликованными учениками в Delphi? - PullRequest
27 голосов
/ 01 июля 2010

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

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

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

Ответы [ 8 ]

25 голосов
/ 01 июля 2010

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

25 голосов
/ 01 июля 2010

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

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

Public

public
  property MyProperty: integer read FMyProperty write FMyProperty

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

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

published
  property MyProperty: integer read FMyProperty write FMyProperty

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

9 голосов
/ 01 июля 2010

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

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

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

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

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

4 голосов
/ 01 июля 2010

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

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

3 голосов
/ 01 июля 2010

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

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

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

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

3 голосов
/ 01 июля 2010

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

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

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

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

3 голосов
/ 01 июля 2010

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

...